GIF picker sends search terms and IP directly to Giphy, outside any privacy setting #68

Closed
opened 2026-09-12 01:51:24 -04:00 by jared · 0 comments
Owner

Severity: low · Type: security · Confidence: high

Location: src/app/components/GifPicker.tsx:186-236, src/app/components/GifPicker.tsx:78-104 (recent thumbnails), src/app/features/room/RoomInput.tsx:373,1184-1205, config.json:12

Problem

SearchContextManager/Grid from @giphy/react-components talk to api.giphy.com straight
from the browser with the gifApiKey from config.json, so every keystroke-driven GIF search, plus the
user's IP and the Giphy API key, goes to a third party. The Recent row additionally loads
previewUrls from Giphy's CDN directly (not proxied through the homeserver like every other preview
image) the instant the picker opens, even before the user types. None of this is covered by the
urlPreview / mediaAutoLoad privacy settings, and there is no UI disclosure. (Note the picker is
currently inert in this deployment — gifApiKey is "" — so this bites whenever the key is filled in.)

How to trigger

set gifApiKey in config.json, open the GIF picker — network tab shows api.giphy.com and
media*.giphy.com requests before any interaction.

Suggested fix

gate the picker behind an explicit opt-in (or the existing third-party-content setting)
with a one-line disclosure, and proxy the Recent thumbnails through the homeserver's media repo (the
sent GIF is already re-uploaded as mxc://, so a preview mxc is available).


Filed from the September 2026 client audit (branch lotus @ 4bea4895).

**Severity:** low · **Type:** security · **Confidence:** high **Location:** `src/app/components/GifPicker.tsx:186-236`, `src/app/components/GifPicker.tsx:78-104` (recent thumbnails), `src/app/features/room/RoomInput.tsx:373,1184-1205`, `config.json:12` ### Problem `SearchContextManager`/`Grid` from `@giphy/react-components` talk to `api.giphy.com` straight from the browser with the `gifApiKey` from `config.json`, so every keystroke-driven GIF search, plus the user's IP and the Giphy API key, goes to a third party. The Recent row additionally loads `previewUrl`s from Giphy's CDN directly (not proxied through the homeserver like every other preview image) the instant the picker opens, even before the user types. None of this is covered by the `urlPreview` / `mediaAutoLoad` privacy settings, and there is no UI disclosure. (Note the picker is currently inert in this deployment — `gifApiKey` is `""` — so this bites whenever the key is filled in.) ### How to trigger set `gifApiKey` in `config.json`, open the GIF picker — network tab shows `api.giphy.com` and `media*.giphy.com` requests before any interaction. ### Suggested fix gate the picker behind an explicit opt-in (or the existing third-party-content setting) with a one-line disclosure, and proxy the Recent thumbnails through the homeserver's media repo (the sent GIF is already re-uploaded as `mxc://`, so a preview mxc is available). --- _Filed from the September 2026 client audit (branch `lotus` @ 4bea4895)._
jared added this to the Audit 2026-09 · Medium & Low milestone 2026-09-12 01:51:24 -04:00
jared added the bugpriority: lowsecurityarea: messaging labels 2026-09-12 01:51:24 -04:00
jared self-assigned this 2026-09-12 01:51:24 -04:00
jared closed this issue 2026-09-12 20:29:06 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#68