XMPP: key-exchange stanza.from null-fallback is inconsistent — keyshare met null from vindt geen kandidaten #1429
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#1429
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—handleDevicePresence(regel 225) enhandleKeyshare(regel 254) gebruiken beidestanza.from ?? roomJidals fallback voor een nullfrom. Maar de fallback is semantisch inconsistent tussen de twee handlers:handleDevicePresenceingest een device metpeerAddress = stanza.from ?? roomJid. Alsfromnull is, wordt het device geassocieerd metroomJid(room@conf, zonder nick).handleKeysharezoekt kandidaten metdirectory.devicesForAddress(stanza.from ?? roomJid). Alsfromnull is, zoekt hij devices metpeerAddress == roomJid.Als
fromnull is voor een device-presence, wordt het device geassocieerd metroomJid. Alsfromnull is voor een keyshare, zoekt hij devices metpeerAddress == roomJid— en vindt de device die metroomJidwas geassocieerd. Dat is intern consistent.Maar de echte bug is: als
fromnull is voor een device-presence, wordt het device geassocieerd metroomJidin plaats van metroom@conf/nick. Later, als een keyshare aankomt métfrom = room@conf/nick(de normale situatie), zoekthandleKeysharenaar devices metpeerAddress == room@conf/nick— en vindt de device niet, want die is geassocieerd metroomJid.Wat er gebeurt
from = null(of een stanza zonderfrom-attribuut).handleDevicePresenceingest het device metpeerAddress = roomJid.from = room@conf/nick(normaal).handleKeysharezoektdirectory.devicesForAddress(room@conf/nick)— vindt niets.logWarning('xmpp.keyexchange.keyshare.unknownSender', ...)).Trust boundary
MUC-server → Applicatie (key-exchange). Een buggy of vijandige server stuurt presence zonder
from.Impact
Een deelnemer wiens device-presence zonder
fromarriveert, wordt verkeerd geassocieerd en kan nooit gesleuteld worden. De keyshare vindt geen kandidaat en wordt gedropt. De deelnemer is permanent uitgesloten van de samenwerking zonder foutmelding.Oplossingsrichting
fromin de key-exchange. Een MUC-presence of groupchat-message zonderfromis geen geldige MUC-stanza (XEP-0045 §7.2.1 — de server zet altijd eenfrommet de occupant-JID). Dropp de stanza fail-closed in plaats van een semantisch incorrecte fallback te gebruiken:Dit in zowel
handleDevicePresencealshandleKeyshare.devicesForAddressook devices vindt die met een afgeleide vanroomJidzijn geassocieerd. Maar optie 1 is eenvoudiger en veiliger.Locatie
lib/xmpp/xmpp_key_exchange.dartregel 225 (handleDevicePresencefallback), regel 254 (handleKeysharefallback), regel 255 (devicesForAddresslookup)lib/collab/collab_device_directory.dartregels 147–150 (devicesForAddress— filtert op exactepeerAddress-match)Severity
MEDIUM — een buggy server kan een deelnemer permanent uitsluiten van keying.