| CVE | Vulnerability name | Date | Responsible Security Disclosure by | Vulnerabilities |
|---|---|---|---|---|
|
GHSA-6jr3-42jf-vhm5
|
AuthorBleed |
2026-08-15 |
ybsun0215 and xet7
![]() Coordinated disclosure via GitHub Security Advisory GHSA-6jr3-42jf-vhm5. |
|
Six paths recorded who did something from a field the caller sends:
POST /api/boards/{boardId}/lists/{listId}/cards (single, and the linked form)
POST /api/boards/{boardId}/lists/{listId}/cards/bulk
DELETE /api/boards/{boardId}/lists/{listId}/cards/{cardId}
DELETE /api/boards/{boardId}/cards/bulk
POST /api/boards/{boardId}/custom-fields
The check was that the named user exists — not that it is the caller:
// server/models/cards.js — before
const checkUser = await ReactiveCache.getUser(req.body.authorId); // existence only
...
userId: req.body.authorId, // recorded as the card's creator
await cardCreation(req.body.authorId, card); // and in the activity feed
An existence check is not an authentication check. It confirms that the name in the envelope belongs to somebody; it says nothing about who wrote the letter.
For comparison, the comment endpoint fixed in 8.19 uses the session:
// server/models/cardComments.js
userId: req.userId,
Every one of the six does the same now. tests/restApiIdorBatch.test.cjs pins each path by what it records, and that no card or custom-field path reads authorId from the body again.