XMPP: geen stroomregeling op inbound stanzas tijdens live sessie — vijandige server kan demux/handlers overstromen #1420
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#1420
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_session.dart—_startDispatch(regels 498–509) parsed elke inbound frame tot eenStanzaen voegt hem toe aan_inbound(een broadcastStreamController). Tijdens de handshake is er een frame-queue-cap (256) en een frame-grootte-cap (512 KiB), maar in de live sessie (drain-mode) is er geen stroomregeling — elke frame wordt direct doorgegeven aan de demux.lib/xmpp/companion_demux.dart—_onStanza(regels 56–82) roept de handler aan methandler(stanza).catchError(...)— fire-and-forget, niet awaited. Elke stanza start een asynchrone handler die kan proberen een verzegeling te openen (CPU-intensief: AEAD-decryptie, handtekeningverificatie). Een vloed stanzas start een vloed gelijktijdige handlers.Wat er gebeurt
Een vijandige server stuurt een stroom stanzas (binnen de 512 KiB frame-cap per stuk). Elke stanza wordt geparsed, aan
_inboundtoegevoegd, door de demux gerouteerd naar een handler, en de handler start een async open/verificatie. Omdat handlers niet worden geserialiseerd, lopen er tientallen gelijktijdig — elk met crypto-operaties. Dit veroorzaakt:Stanzaen tijdelijke crypto-buffers vast.De
_FrameReader-queue-cap (256) geldt alleen vóór de drain-modus — zodra de sessie live is, is er geen backpressure.Trust boundary
Netwerk (vijandige XMPP-server) → Applicatie (stanza-dispatch + crypto).
Impact
Een vijandige server kan de app onresponsief maken door een stroom stanzas te sturen. De aanval is stil — geen crash, maar de UI bevriest en het geheugen groeit.
Oplossingsrichting
Locatie
lib/xmpp/xmpp_session.dartregels 498–509 (_startDispatch— drain zonder backpressure)lib/xmpp/companion_demux.dartregels 56–82 (_onStanza— fire-and-forget handler-aanroep)Severity
MEDIUM — CPU/geheugen-DoS door een vijandige server, met UI-bevriezing als zichtbaar effect.