IDOR: Reaction endpoints bypass conversation permission checks
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 55/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- mongodb, typescript
- Ambito
- authorization, security
Direzione di ricerca
Inizia in server/services/core/chat/message.service.ts con addReaction e removeReaction, quindi confronta la ricerca dei messaggi con checkConversePermission() e con le altre operazioni sui messaggi elencate nell’issue. Assicurati che entrambi i percorsi delle reazioni verifichino la conversazione e il gruppo del messaggio prima di modificare le reazioni; il lavoro è completato quando gli utenti non autorizzati non possono influire sui messaggi né dedurne informazioni, mentre il comportamento delle reazioni consentite rimane intatto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
The addReaction and removeReaction methods in server/services/core/chat/message.service.ts bypass the checkConversePermission() check that all other message operations use. This allows any authenticated user to add/remove reactions on messages in conversations they are not a member of, by specifying the target message's MongoDB ObjectID.
Vulnerable Code
In message.service.ts, the addReaction method (around line 492) and removeReaction method (around line 533) perform a direct findById(messageId) without any permission verification:
// addReaction - NO permission check
const message = await this.adapter.model.findById(messageId);
// removeReaction - NO permission check
const message = await this.adapter.model.findById(messageId);
Secure Comparison
All other message operations correctly call checkConversePermission() before accessing messages:
sendMessage(line ~201):await this.checkConversePermission(ctx, converseId, groupId)getMessage/deleteMessage/recallMessage/editMessage/fetchConverseLastMessages/fetchNearbyMessage: All callcheckConversePermission()
The checkConversePermission() method (line ~577) validates that the user is either a member of the group's panel, or a participant in the DM conversation.
Impact
- Severity: Medium - Requires valid MongoDB ObjectID (not easily guessable), but allows cross-conversation reaction manipulation
- Any authenticated user can add emoji reactions to messages in private groups/DMs they don't belong to
- Any authenticated user can remove other users' reactions from messages they can't access
- Reveals message existence (side-channel information disclosure)
Suggested Fix
Add checkConversePermission() call at the start of both addReaction and removeReaction:
async addReaction(ctx, messageId, emoji) {
const message = await this.adapter.model.findById(messageId);
if (!message) throw new Error('Message not found');
// Add this permission check:
await this.checkConversePermission(ctx, String(message.converseId), message.groupId ? String(message.groupId) : undefined);
// ... rest of the method
}
Apply the same pattern to removeReaction.
Discovery
Found through automated security research comparing permission patterns across message operation endpoints.
- Lingua principale
- TypeScript
- Stelle
- 3.6k
- Fork
- 398
- Merge medio
- 1h 14m
- PR unite (30g)
- 2
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di msgbyte/tailchat
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
在某些地方用户名中的特殊符号并不能很好的显示 || Special symbols in user names are not displayed well in some places Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 50/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 48/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
Tutte le issue di msgbyte/tailchat
Issue simili
-
blocklist removal
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
MetaMask/eth-phishing-detect#296544 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
pastelsky/bundlephobia#1122 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
category/development priority/P2 scope/file-operations scope/testing type/enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Enatega Customer and Rider app: Add-ons price is not visible to customer after order is placed. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100