XMPP: chat-_pending onbegrensd + head-of-line blocking — geheugen-DoS en chat-blokkade #1412
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#1412
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_chat.dart— de_pending-lijst (regel 110) is eenList<SealedEnvelope>zonder cap.retryPending(regels 188–202) verwerkt de lijst van voren en breekt bij het eerste bericht dat niet geopend kan worden (_openretourneertnullbij een onbekende afzender).Twee problemen
1. Head-of-line blocking. Eén stanza met een onbekend
senderDeviceblokkeert de hele buffer.directory.resolve(sealed.senderDevice)retourneertnull,_openretourneertnull,retryPendingbreekt — alle volgende berichten (ook van bekende afzenders) blijven in_pendingstaan en worden nooit getoond. Een enkele vijandige stanza met een verzonnensenderDeviceschakelt de hele chat uit.2. Onbegrensde groei. Elke inbound
<chat>-stanza wordt aan_pendingtoegevoegd (regel 179) vóórretryPending. Als de head-of-line blokkeert, groeit_pendingonbegrensd met elke nieuwe stanza — geheugen-exhaustie. Een vijandige server (of MUC die groupchat reflecteert) kan dit uitbuiten door een stroom berichten te sturen.Trust boundary
MUC (companion room) → Applicatie (chat-buffer). De MUC reflecteert elke groupchat-message; een occupant kan stanzas sturen met een willekeurig
senderDevicein de verzegeling.Impact
_pending).Oplossingsrichting
_pendingmet een cap (bijv. 256, vergelijkbaar met_maxDeferredin het transport). Bij overflow verdrijf het oudste (FIFO).retryPendingnietbreak-t bijnullmaarcontinue-t._pending-entries — een bericht dat na N ronden nog niet openbaar is, wordt fail-closed gedropt (vergelijkbaar met_maxDeferralRoundsin het transport).Locatie
lib/xmpp/xmpp_chat.dartregels 106–114 (_pending-declaratie), 161–184 (handleChat), 188–202 (retryPending), 209–234 (_open)Severity
MEDIUM — chat is niet-veiligheidskritiek, maar de blokkade is onzichtbaar en de geheugen-DoS is reëel.