XMPP: snapshot chunk-data niet lengte-gevalideerd bij ontvangst — vijandige server kan oversized chunks sturen #1419
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#1419
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_snapshot.dart—handleSnapshot(regels 165–202) valideert de chunk-velden (id,i,n,data) op type en bereik, maar niet op grootte van hetdata-veld. DemaxChunkChars-constante (48000) wordt alleen gebruikt op de zender-kant (_split, regel 139) om chunks te splitsen; de ontvanger accepteert elk string-grootte.Wat er gebeurt
Een vijandige server (of een occupant die groupchat-messages reflecteert krijgt) kan een chunk sturen met
data: "<multi-MB string>". De chunk wordt gevalideerd (data is String→ true), in_pendinggeplaatst, en bij reassemblage in deStringBuffergeschreven. De totale gereassembleerde blob kan veel groter zijn dan de 512 KiB frame-cap die op_FrameReader-niveau geldt — want de chunk-datakan base64-geëncodeerde ciphertext bevatten die binnen één frame past, maar bij reassemblage met andere chunks een blob van meerdere MB vormt.Wait — eigenlijk is het frame al cap'd op 512 KiB door
_FrameReader._maxFrameBytes. Dus een enkele chunk-datakan maximaal ~512 KiB zijn. MaarmaxChunksis 512, dus de totale gereassembleerde blob kan oplopen tot 512 × 512 KiB = 256 MiB. Dat is ruim voldoende voor geheugen-exhaustie.Trust boundary
MUC (companion room) → Applicatie (snapshot-reassemblage).
Impact
Geheugen-exhaustie: een vijandige server stuurt 512 chunks van elk ~512 KiB, die worden gereassembleerd tot een ~256 MiB blob in een
StringBuffer, die vervolgens wordt geparsed als JSON (wat mislukt, maar de blob is al in het geheugen geladen).Oplossingsrichting
datagrootte bij ontvangst: weiger een chunk waarvandata.length > maxChunkChars(dezelfde cap als de zender). Dit is een één-regel check inhandleSnapshotna de bestaande validatie.Locatie
lib/xmpp/xmpp_snapshot.dartregels 165–202 (handleSnapshot— validatie), 204–216 (_assemble—StringBuffer), 62–63 (maxChunkChars,maxChunks)Severity
MEDIUM — geheugen-DoS, maar beperkt door de frame-cap van 512 KiB per chunk.