Incoming io.lotus.* toWidget actions are accepted from any origin
#15
Closed
opened 2026-09-12 02:13:04 -04:00 by jared
·
1 comment
No Branch/Tag Specified
lotus
chore/dev-tool-security
feat/expected-devices
lotus-upstream-v0.28.0
feat/call-summary-details
feat/soundboard-mic-mix
feat/mobile-self-tile
feat/screenshare-audio-state
feat/decorations-origin
docs/lotus-call-error
lotus-stall-retry
docs/lotus-protocol
lotus-soundboard-not-permitted
lotus-mic-sampler-churn
lotus-call-error
fix/audio-output-list
lotus-notify-none
lotus-screenshare-prompt
lotus-call-origin
v0.28.0-lotus.4
v0.28.0-lotus.3
v0.28.0-lotus.2
v0.28.0-lotus.1
v0.25.0-lotus.29
v0.25.0-lotus.28
v0.25.0-lotus.27
v0.25.0-lotus.26
v0.25.0-lotus.25
v0.25.0-lotus.24
v0.25.0-lotus.23
v0.25.0-lotus.22
v0.25.0-lotus.21
v0.25.0-lotus.20
v0.25.0-lotus.19
v0.25.0-lotus.18
v0.25.0-lotus.17
v0.25.0-lotus.16
v0.25.0-lotus.15
v0.25.0-lotus.14
v0.25.0-lotus.13
v0.25.0-lotus.12
v0.25.0-lotus.11
v0.25.0-lotus.10
v0.25.0-lotus.9
v0.25.0-lotus.8
v0.25.0-lotus.7
v0.25.0-lotus.6
v0.25.0-lotus.5
v0.25.0-lotus.4
v0.25.0-lotus.3
v0.25.0-lotus.2
v0.25.0-lotus.1
v0.20.1
Labels
Clear labels
a11y
area: audio-pipeline
area: build-publish
area: deafen
area: decorations
area: denoise
area: livekit
area: mobile-ui
area: soundboard-inject
area: upstream-sync
area: widget-actions
bug
dependencies
docs
enhancement
performance
priority: critical
priority: high
priority: low
priority: medium
research
security
tech-debt
ux
Accessibility
Fork area: audio-pipeline
Fork area: build-publish
Fork area: deafen
Fork area: decorations
Fork area: denoise
Fork area: livekit
Fork area: mobile-ui
Fork area: soundboard-inject
Fork area: upstream-sync
Fork area: widget-actions
Something is not working
Package versions and advisories
Docs wrong or missing
New feature
Audio pipeline cost, re-render storms, leaks
Data loss, security hole, or crash on a main path
Broken feature or serious usability problem
Minor issue or polish
Wrong behaviour in an edge case or notable degradation
Origin checks, capability leaks, media/key handling
Code health, fragile patterns
Usability or visual inconsistency
Milestone
No items
No Milestone
EC fork audit 2026-09 · Medium & Low
Projects
Clear projects
No projects
Notifications
Due Date
Dependencies
No dependencies set.
Reference: LotusGuild/element-call#15
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: medium · Type: security · Confidence: high
Location:
src/widget.ts:104-113,src/lotus/lotusActions.ts:35-41,node_modules/.pnpm/matrix-widget-api@1.17.0/.../transport/PostmessageTransport.js:55,66Problem
PostmessageTransport.handleMessageskips origin validation unlessstrictOriginCheckis set (defaultfalse, and EC never sets it); it also does not checkev.sourceor thatwidgetIdmatches. Outbound sends are pinned toclientOrigin, but inbound requests from any frame that canpostMessagethe EC window are dispatched. The fork widens the blast radius of this inherited weakness by registering five new toWidget actions ininitializeWidgetthat mutate live call behaviour:inject_audio(publishes an attacker-supplied audio URL as a real LiveKit track into the call),set_deafen,set_quality,focus_participant, anddecorations(renders attacker-chosen https images on tiles). Upstream only exposed hangup/device_mute here.How to trigger
any page holding a window handle on the EC iframe/window (opener, embedder, or a same-origin frame) posts
{api:"toWidget", action:"io.lotus.inject_audio", widgetId:<any>, requestId:"x", data:{url:"https://evil/clip.mp3"}}.Suggested fix
after constructing the
WidgetApi, setapi.transport.strictOriginCheck = true— in the Lotus deployment cinny serves EC from its own origin (/public/element-call/index.html), soglobalThis.origin === parentOriginand the check passes; otherwise add an explicitev.origin === parentOriginguard before dispatching lotus actions.Filed from the September 2026 audit (branch
lotus).Fixed in
37c9348e, shipped in0.25.0-lotus.1(published by CI from tag v0.25.0-lotus.1) and consumed by cinny at 9a85a487.