XMPP: MUC-presence zonder resource/nick wordt geaccepteerd met lege string als occupant #1426

Closed
opened 2026-08-09 18:34:04 +00:00 by brenno · 0 comments
Owner

Bevinding

lib/xmpp/xmpp_muc.dart_onStanza (regel 169) haalt de occupant-nick uit de from-JID via _resourceOf(from). Als de from geen slash bevat (geen resource), retourneert _resourceOf een lege string (regel 291–293):

static String _resourceOf(String jid) {
  final slash = jid.indexOf('/');
  return slash < 0 ? '' : jid.substring(slash + 1);
}

Deze lege string wordt gebruikt als key in _occupants[occNick] (regel 215) en als nick in de MucOccupant (regel 216). Een presence-stanza met from = "room@conf" (zonder /nick) creëert een ghost-occupant met nick "".

Wat er gebeurt

Een buggy of vijandige server stuurt een presence-stanza met from = "room@conf" (geen resource). De code:

  1. Filtert de stanza niet uit (_bareJid(from) == roomJid is true, regel 168)
  2. occNick = "" (regel 169)
  3. isSelf = codes.contains('110') || occNick == nick (regel 189) — als onze eigen nick toevallig "" is (onwaarschijnlijk maar niet onmogelijk), wordt dit als self-presence behandeld en de join voltooid
  4. De ghost-occupant met nick "" wordt aan de roster toegevoegd (regel 215)
  5. De UI toont een deelnemer zonder naam

Trust boundary

MUC-server → Applicatie (presence-parser). Een buggy of vijandige server stuurt presence zonder resource.

Impact

  • Een ghost-occupant met lege nick verschijnt in de roster en de UI.
  • Als occNick == nick en onze nick is leeg (edge-case), kan de join incorrect voltooid worden.
  • De ghost-occupant kan de _maxOccupants-cap vullen met een entry die nooit wordt verwijderd (een unavailable-presence voor "" verwijdert de entry, maar een vijandige server stuurt die niet).

Oplossingsrichting

Dropp presence-stanzas zonder resource vóór verwerking. Voeg na regel 168 een check toe:

if (!from.contains('/')) return; // geen resource → geen geldige MUC-presence

Of specifieker: if (occNick.isEmpty) return; na regel 169. Dit weigert presence zonder nick, wat consistent is met XEP-0045 (een occupant-JID moet een resource hebben).

Locatie

  • lib/xmpp/xmpp_muc.dart regel 169 (_resourceOf), 189 (isSelf-check), 215 (_occupants[occNick]), 291–293 (_resourceOf-helper)

Severity

LOW — een ghost-occupant is zichtbaar maar niet schadelijk; de edge-case met lege self-nick is onwaarschijnlijk.

## Bevinding `lib/xmpp/xmpp_muc.dart` — `_onStanza` (regel 169) haalt de occupant-nick uit de `from`-JID via `_resourceOf(from)`. Als de `from` geen slash bevat (geen resource), retourneert `_resourceOf` een lege string (regel 291–293): ```dart static String _resourceOf(String jid) { final slash = jid.indexOf('/'); return slash < 0 ? '' : jid.substring(slash + 1); } ``` Deze lege string wordt gebruikt als key in `_occupants[occNick]` (regel 215) en als `nick` in de `MucOccupant` (regel 216). Een presence-stanza met `from = "room@conf"` (zonder `/nick`) creëert een ghost-occupant met nick `""`. ### Wat er gebeurt Een buggy of vijandige server stuurt een presence-stanza met `from = "room@conf"` (geen resource). De code: 1. Filtert de stanza niet uit (`_bareJid(from) == roomJid` is true, regel 168) 2. `occNick = ""` (regel 169) 3. `isSelf = codes.contains('110') || occNick == nick` (regel 189) — als onze eigen nick toevallig `""` is (onwaarschijnlijk maar niet onmogelijk), wordt dit als self-presence behandeld en de join voltooid 4. De ghost-occupant met nick `""` wordt aan de roster toegevoegd (regel 215) 5. De UI toont een deelnemer zonder naam ### Trust boundary MUC-server → Applicatie (presence-parser). Een buggy of vijandige server stuurt presence zonder resource. ### Impact - Een ghost-occupant met lege nick verschijnt in de roster en de UI. - Als `occNick == nick` en onze nick is leeg (edge-case), kan de join incorrect voltooid worden. - De ghost-occupant kan de `_maxOccupants`-cap vullen met een entry die nooit wordt verwijderd (een `unavailable`-presence voor `""` verwijdert de entry, maar een vijandige server stuurt die niet). ### Oplossingsrichting Dropp presence-stanzas zonder resource vóór verwerking. Voeg na regel 168 een check toe: ```dart if (!from.contains('/')) return; // geen resource → geen geldige MUC-presence ``` Of specifieker: `if (occNick.isEmpty) return;` na regel 169. Dit weigert presence zonder nick, wat consistent is met XEP-0045 (een occupant-JID moet een resource hebben). ### Locatie - `lib/xmpp/xmpp_muc.dart` regel 169 (`_resourceOf`), 189 (`isSelf`-check), 215 (`_occupants[occNick]`), 291–293 (`_resourceOf`-helper) ### Severity LOW — een ghost-occupant is zichtbaar maar niet schadelijk; de edge-case met lege self-nick is onwaarschijnlijk.
brenno 2026-08-09 20:56:35 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1426
No description provided.