XMPP: snapshot-_assembled map onbegrensd — gereassembleerde snapshots met onbekende afzender blijven forever staan #1414
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#1414
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— de_assembled-map (regel 99) is eenMap<String, SealedEnvelope>zonder cap. Een snapshot die volledig is gereassembleerd maar niet geopend kan worden (onbekende afzender, of epoch-sleutel nog niet aanwezig) blijft in_assembledstaan.Wat er gebeurt
De
_pending-map (chunks) is cap'd opmaxPendingSnapshots(4), maar zodra een snapshot is gereassembleerd, verhuist hij van_pendingnaar_assembled— wat de_pending-slot vrijmaakt voor een nieuwe snapshot. Een vijandige server kan cyclen: 4 snapshots sturen, ze worden gereassembleerd, 4 meer sturen, enzovoort._assembledgroeit onbegrensd._tryOpen(regels 224–264) verwijdert een entry alleen bij:unknown-epochfout (regel 261),Als de afzender onbekend is (
directory.resolveretourneertnull, regel 232–233), retourneert_tryOpenvroegtijdig zonder de entry te verwijderen. De entry blijft forever staan.Trust boundary
MUC (companion room) → Applicatie (snapshot-reassemblage). Een occupant kan snapshots sturen met een verzonnen
senderDevice.Impact
Geheugen-exhaustie. Elke gereassembleerde snapshot is een volledige verzegelde baseline (potentieel tientallen KB tot MB). Een vijandige server kan
_assembledvullen met honderden nep-snapshots die nooit worden opgeruimd.Oplossingsrichting
_assembledmet een cap (bijv. 8 ofmaxPendingSnapshots * 2). Bij overflow verdrijf de oudste entry.retryPending-ronden nog steeds onbekend is, wordt fail-closed gedropt.idbevat de afzender'sdeviceId; verifieer dat de directory een device met datdeviceIdkent vóór reassemblage. Een snapshot van een onbekend device wordt dan geweigerd vóór de chunks worden gebufferd.Locatie
lib/xmpp/xmpp_snapshot.dartregels 92–99 (_assembled-declaratie), 204–216 (_assemble), 224–264 (_tryOpen)Severity
MEDIUM — geheugen-DoS, versterkt door het feit dat
_pending-cap de aanvaller helpt cyclen.