| CVE | Vulnerability name | Date | Responsible Security Disclosure by | Vulnerabilities |
|---|---|---|---|---|
|
GHSA-r8r3-23vr-8jh6
|
StaleBleed |
2026-08-15 |
ybsun0215 and xet7
![]() Coordinated disclosure via GitHub Security Advisory GHSA-r8r3-23vr-8jh6. |
|
A user can list the boards they are a member of:
GET /api/users/{userId}/boards
The selector matched the membership array with a dotted path:
// server/models/boards.js — before
const boards = await ReactiveCache.getBoards(
{
archived: false,
'members.userId': paramUserId, // ignores members.$.isActive
},
...
A dotted match asks "does any entry have this userId?". It cannot ask "does any entry have this userId AND is active", because in Mongo those two conditions on a dotted path may be satisfied by DIFFERENT entries of the array. That is what $elemMatch is for, and it is what the rest of WeKan uses.
The fix:
// server/models/boards.js — after
members: { $elemMatch: { userId: paramUserId, isActive: true } },
tests/restApiIdorBatch.test.cjs pins the $elemMatch form and that the dotted match does not return.