NewN-Day-BenchView benchmark
winfunc
Back to Hacktivity

Status: Patched

This vulnerability has been verified as resolved and deployed.

Jitsi Meet logo
Jitsi MeetHigh2026-09-10

Regex room-claim case mutation permits unauthorized protected-meeting access

Summary

Lowercasing a signed Lua pattern changed the room policy after JWT verification

A participant with a legitimate regex-scoped JWT could join a protected room that the issuer's signed pattern did not authorize. A claim such as ^team-%D+$ was transformed into ^team-%d+$, turning a non-digit policy into a digit policy before the MUC join check.

Root cause. Util:verify_room() lowercased the room claim before deciding whether it was a literal room or a Lua pattern. Case conversion is safe for a canonical room identifier, but it mutates pattern operators such as %D, %A, %S, and %W into operators with different meanings.

Remediation evidence. Jitsi opened PR #17803 the day after the disclosure and merged it on 10 September 2026. The patch preserves regex claims byte-for-byte, canonicalizes literal claims separately, requires a full-string match, and adds paired uppercase/lowercase pattern regression tests.

CVSS Score

VectorN
ComplexityL
PrivilegesL
User InteractionN
ScopeU
ConfidentialityH
IntegrityL
AvailabilityN
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N

Vulnerability Location

SourceLine 32
resources/prosody-plugins/mod_jitsi_session.lua
init_session()
SinkLine 457
resources/prosody-plugins/token/util.lib.lua
Util:verify_room()

Source-to-Sink Analysis

1
resources/prosody-plugins/mod_jitsi_session.lua:32

The public BOSH/WebSocket session accepts a valid bearer JWT and stores it on the authoritative Prosody session.

PYTHON
if request.headers["authorization"] then
  token = request.headers["authorization"]:sub(8)
end
session.auth_token = token
2
resources/prosody-plugins/token/util.lib.lua:335

Signature, issuer, and audience verification succeeds, after which the signed room expression and regex marker become session policy.

PYTHON
local claims = jwt.verify(session.auth_token, algorithm, key, issuers, audiences)
session.jitsi_meet_room = claims["room"]
session.jitsi_meet_context_room = claims["context"]["room"]
3
resources/prosody-plugins/token/util.lib.lua:457

The vulnerable verifier lowercased pattern syntax, so the resulting expression authorized a different set of rooms than the issuer signed.

PYTHON
local auth_room = string.lower(session.jitsi_meet_room)
local result = string.match(room_node, auth_room)

Impact Analysis

Critical Impact

The attacker crosses the issuer-defined room boundary and joins an existing protected meeting as a participant, gaining its chat, signaling, and media participation path. The finding does not claim moderator privileges or a service-wide outage.

Attack Surface

Public Jitsi BOSH or XMPP WebSocket authentication and MUC join handling in deployments that enable token verification and regex room claims.

Preconditions

The attacker needs an ordinary valid participant JWT containing an affected uppercase Lua pattern class, and a same-tenant room that matches the lowercased pattern but not the signed pattern. No signing key or moderator credential is required.

Proof of Concept

Environment Setup

Run an isolated token-authenticated Jitsi deployment on a vulnerable revision and create the protected room team-123.

Target Configuration

Issue an ordinary participant JWT with room: "^team-%D+$" and context.room.regex: true. The token must otherwise have a valid signature, issuer, audience, and tenant scope.

Exploit Delivery

Authenticate using the legitimate token, then send a normal MUC join presence for team-123@conference.example.test/attacker.

Outcome

PR #17803 keeps regex text unchanged and requires a complete match, so the same join is rejected while genuinely matching rooms remain accessible.

Expected Response: The vulnerable server returns successful self-presence and conference signaling even though team-123 does not match the signed %D policy.

Run this level of analysis on your repo.

Winfunc traces source-to-sink paths, validates exploitability, and gives your team patch-ready remediation.

Vulnerability Detection