share_keys() marks outbound Megolm session as shared despite failed Olm session establishment — silent key loss, no recovery
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 30/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- python
- Lĩnh vực
- cryptography
Hướng nghiên cứu
Bắt đầu bằng cách theo dõi share_keys() qua crypto manager và trạng thái crypto_megolm_outbound_session được mô tả trong issue, sử dụng cảnh báo "No one-time keys nor device keys got when trying to share keys" làm điểm thất bại. Xác định cách một lần thiết lập Olm thất bại dẫn đến shared=1 và xác định liệu việc hoàn tất có yêu cầu thử lại với các thiết bị đang chờ xử lý, giữ lại một phiên chưa được chia sẻ hay một đường dẫn khôi phục khác hay không.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
In mautrix-python 0.21.1, when the crypto manager shares a newly-created outbound Megolm session via share_keys(), a failure to establish an Olm session with a recipient device (e.g. the device has no claimable one-time keys) does not prevent the outbound session from being marked as shared. The share failure is only visible as a mau.crypto logger warning ("No one-time keys nor device keys got when trying to share keys"), which is easy to miss — from that point on, every message encrypted under that outbound session is undecryptable for the affected device, with no room-key request sent by the client and no built-in recovery path.
Observed behaviour (production, 4 episodes Jul–Sep 2026)
Gateway-style bot (the Hermes agent's Matrix platform adapter, which uses mautrix-python for E2EE) running against matrix.org, in encrypted rooms with a user holding 3 active devices:
- Process restart → new outbound Megolm session created for the room.
- During the initial
share_keys(), one or more devices have no available one-time keys. Pairs of warnings are logged:
(two warnings per retry — observed 2–6 warnings per episode)WARNING mau.crypto: No one-time keys nor device keys got when trying to share keys - The outbound session is nevertheless marked as shared (
shared=1incrypto_megolm_outbound_session) and all subsequent room messages are encrypted under it. - Affected devices show
m.unable_to_decryptfor every later event in the room. The sessions created before the restart remain readable — only the new outbound session's traffic is lost for the omitted device. - The state persists until the outbound Megolm session is discarded and a new one is created after the affected devices have uploaded fresh one-time keys.
Traces from a live episode (2026-09-01, UTC):
01:54:10 WARNING mau.crypto: No one-time keys nor device keys got when trying to share keys
01:54:11 WARNING mau.crypto: No one-time keys nor device keys got when trying to share keys
01:57:37 WARNING mau.crypto: No one-time keys nor device keys got when trying to share keys
...
15:36:32 (new outbound Megolm session created, shared=1, message_count>0)
16:26:37 WARNING mau.client.crypto: Failed to decrypt $...: Failed to decrypt megolm event: no session with given ID <id> found
Expected behaviour
Either (a) the outbound session should not be marked shared while any recipient device failed to receive the key, with the share retried when the device comes back online / uploads OTKs, or (b) the omitted device's client should issue an m.room_key_request that the sender fulfils, per the standard key-recovery path. Today neither happens: the failure is silent at the protocol level, so recovery depends entirely on application-level workarounds.
Suggested directions
- Return a per-device success/failure result from the share step and let the caller decide whether to keep or rotate the session.
- Track "pending share" devices on the outbound session and retry the Olm-transport of the room key when the device reappears (OTK claim succeeds), instead of only warning.
- On decrypt failure with
OLM_PREKEYmissing, consider prompting a room-key request from the affected side (this may be more natural at the client layer, but a library hook would help).
Workaround used (application level)
Discard the outbound Megolm session row while the process is restarting (the session is cached in memory by the running crypto manager — deleting the DB row while running gets it resurrected from cache), ensure the user's devices have uploaded fresh one-time keys (opening the client suffices), then have any member send a message so a fresh session is created and shared. Verified working, but it requires application-level surgery on the crypto store and a coordinated restart — not something every deployment can do.
Environment
- mautrix-python 0.21.1 (latest release as of 2026-09-01)
- Python 3.13, Linux, matrix.org homeserver
- Bot account with cross-signing verified, store version 10
- Affected clients: Element X (iOS/iPadOS), Element macOS — i.e. current, maintained clients
- Ngôn ngữ chính
- Python
- Star
- 249
- Fork
- 84
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của mautrix/python
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 45/100
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 38/100
Tất cả issue của mautrix/python
Issue tương tự
-
documentation help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 90/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 90/100
simonw/sqlite-utils#872 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100