Software /
code /
prosody
Annotate
plugins/muc/util.lib.lua @ 12181:783056b4e448 0.11 0.11.12
util.xml: Do not allow doctypes, comments or processing instructions
Yes. This is as bad as it sounds. CVE pending.
In Prosody itself, this only affects mod_websocket, which uses util.xml
to parse the <open/> frame, thus allowing unauthenticated remote DoS
using Billion Laughs. However, third-party modules using util.xml may
also be affected by this.
This commit installs handlers which disallow the use of doctype
declarations and processing instructions without any escape hatch. It,
by default, also introduces such a handler for comments, however, there
is a way to enable comments nontheless.
This is because util.xml is used to parse human-facing data, where
comments are generally a desirable feature, and also because comments
are generally harmless.
author | Jonas Schäfer <jonas@wielicki.name> |
---|---|
date | Mon, 10 Jan 2022 18:23:54 +0100 |
parent | 9603:4897bd63f624 |
child | 10713:38159b9adf9f |
rev | line source |
---|---|
6218
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
1 -- Prosody IM |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
4 -- Copyright (C) 2014 Daurnimator |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
5 -- |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
6 -- This project is MIT/X11 licensed. Please see the |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
7 -- COPYING file in the source package for more information. |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
8 -- |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
9 |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
10 local _M = {}; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
11 |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
12 _M.valid_affiliations = { |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
13 outcast = -1; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
14 none = 0; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
15 member = 1; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
16 admin = 2; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
17 owner = 3; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
18 }; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
19 |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
20 _M.valid_roles = { |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
21 none = 0; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
22 visitor = 1; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
23 participant = 2; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
24 moderator = 3; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
25 }; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
26 |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
27 local kickable_error_conditions = { |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
28 ["gone"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
29 ["internal-server-error"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
30 ["item-not-found"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
31 ["jid-malformed"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
32 ["recipient-unavailable"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
33 ["redirect"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
34 ["remote-server-not-found"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
35 ["remote-server-timeout"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
36 ["service-unavailable"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
37 ["malformed error"] = true; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
38 }; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
39 function _M.is_kickable_error(stanza) |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
40 local cond = select(2, stanza:get_error()) or "malformed error"; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
41 return kickable_error_conditions[cond]; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
42 end |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
43 |
6271
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
44 local muc_x_filters = { |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
45 ["http://jabber.org/protocol/muc"] = true; |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
46 ["http://jabber.org/protocol/muc#user"] = true; |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
47 } |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
48 local function muc_x_filter(tag) |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
49 if muc_x_filters[tag.attr.xmlns] then |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
50 return nil; |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
51 end |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
52 return tag; |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
53 end |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
54 function _M.filter_muc_x(stanza) |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
55 return stanza:maptags(muc_x_filter); |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
56 end |
006b0e0f0de2
plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
57 |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
58 function _M.only_with_min_role(role) |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
59 local min_role_value = _M.valid_roles[role]; |
9603
4897bd63f624
MUC: Add luacheck annotation for unused parameter in filter function
Matthew Wild <mwild1@gmail.com>
parents:
9599
diff
changeset
|
60 return function (nick, occupant) --luacheck: ignore 212/nick |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
61 if _M.valid_roles[occupant.role or "none"] >= min_role_value then |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
62 return true; |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
63 end |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
64 end; |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
65 end |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
6271
diff
changeset
|
66 |
6218
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
67 return _M; |