XMPP: _isOwnPresence vergelijkt MUC-nick met XMPP-resource — eigen keyshare wordt niet gedropt, andermans kan worden gedropt #1415
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1415
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bevinding
lib/xmpp/xmpp_key_exchange.dart—handleKeyshare(regels 238–271) gebruikt_isOwnPresence(regels 275–283) om de autoriteit's eigen gereflecteerde keyshare te droppen. De methode vergelijkt echter twee verschillende dingen:nickis de MUC-nick — de resource van de in-room JID (room@conf/nick), die door de MUC-server op de stanza'sfromwordt gezet.ownNickResourceis de XMPP-resource — het resource-deel van de bound JID (user@domain/resource), die door de server bij bind wordt toegekend (of door OciDeck aangevraagd).Deze twee hebben geen relatie. De MUC-nick wordt afgeleid uit de bound JID's localpart (via
_nickFrominxmpp_test_connection_dialog.dartregel 116–121:user@domain/resource→ nickuser), niet uit het resource-deel.Wat er gebeurt
Geval 1 (waarschijnlijk):
_isOwnPresenceretourneert vrijwel altijdfalse— de MUC-nick (user) matcht nooit de XMPP-resource (ocid-xxxof server-toegewezen random). De autoriteit's eigen gereflecteerde keyshare wordt niet gedropt.handleKeysharetrial-opent tegen de autoriteit's eigen devices.installEpochKeyprobeert de epoch-sleutel te installeren die de autoriteit al heeft — verspild werk, maar waarschijnlijk onschadelijk.Geval 2 (zeldzaam maar reëel): Als een andere occupant toevallig een MUC-nick kiest die gelijk is aan de autoriteit's XMPP-resource, retourneert
_isOwnPresencetruevoor die occupant's stanzas. Hun keyshares worden incorrect gedropt als "eigen". De autoriteit verwerkt hun keyshare nooit — die deelnemer wordt nooit gesleuteld en kan niet meedoen.Trust boundary
Interne logica — geen externe aanvaller nodig, maar een toevallige nick-botsing kan een deelnemer blokkeren.
Impact
Oplossingsrichting
XmppKeyExchange(of afgeleid uit de bound JID's localpart, zoals_nickFromdat doet). Vergelijk dannick == ownMucNick.XmppKeyExchange(net alsXmppMucdie heeft). De nick is bekend bij join-tijd en heeft niets met de bound JID te maken.sealed.senderDevice == _e2ee.deviceId(dat doethandleDevicePresenceal op regel 210). Dat is betrouwbaarder dan een nick-vergelijking en heeft geen MUC-nick nodig.Locatie
lib/xmpp/xmpp_key_exchange.dartregels 252, 275–283 (_isOwnPresence)lib/widgets/dialogs/xmpp_test_connection_dialog.dartregels 94, 116–121 (_nickFrom— toont hoe de nick werkelijk wordt afgeleid)Severity
MEDIUM — de eigen-echo-detectie is defect; de randcase kan een deelnemer blokkeren.