Content of future message edits and topic metadata leaked to non-subscribers when moving messages to an inaccessible private channel
Résumé
This was discovered in an internal security audit using Claude Code.
Impact
Two data leaks occur when moving messages from a public channel to a private channel. A "non-subscriber" below refers to a user who is not subscribed to the private channel, and therefore under Zulip's access mode...
Paquets affectés
| Écosystème | Paquet | Concernées | Corrigé |
|---|---|---|---|
| Zulip server |
>=4.0 |
12.3 |
Description d'origine La description telle que publiée par la source (souvent en anglais).
This was discovered in an internal security audit using Claude Code.
Impact
Two data leaks occur when moving messages from a public channel to a private channel. A "non-subscriber" below refers to a user who is not subscribed to the private channel, and therefore under Zulip's access model shouldn't have access to its contents.
- A non-subscriber's historical
UserMessagerows (created by starring/reacting/marking-read in the public channel) survive the move, so the non-subscriber keeps receivingupdate_messageevents - leaking the content of any future edits to the affected messages, in a channel whose content should be inaccessible to them. - A non-subscriber's
UserTopicrow - recording that they muted or followed the topic in the public channel - is migrated into the private target channel instead of removed. This both persists the row and pushes to that user auser_topicevent carrying the private channel'sstream_idandtopic_name.
Root cause
Both leaks stem from access being inferred from Subscription rows, while in a public channel a user can hold a UserMessage or UserTopic row without any subscription:
- Content-edit
update_messageevents were sent to every holder of aUserMessagerow, with no access check at all - so a non-subscriber's surviving rows kept delivering edits. - On a channel move, the set of users "losing access" (whose
UserTopicrow is removed rather than migrated) is derived fromSubscriptionrows on the old channe…
Source: GitHub Repository Security Advisories (Game のスタック) GitHub Advisory OSV
Références
- GITHUB_REPO_ADVISORY zulip/zulip