GHSA-5q8v-j673-m5v4 Firefly III user API endpoints expose all users' information to any authenticated user (IDOR)
Any authenticated user can access all user account details, including emails and roles, due to missing authorization checks on API endpoints.
- Exploited in the wild
- Not known
- Login needed
- Any signed-in user
- Attackable
- Over the internet
- Victim action needed
- Not needed
- Fix
- Available
What is GHSA-5q8v-j673-m5v4?
GHSA-5q8v-j673-m5v4 is a missing authorization vulnerability in grumpydictator/firefly-iii, published on 7 Mar 2026. Any signed-in user can exploit it over the network, with no action from the victim.
Official description
Summary
The User management API endpoints (GET /api/v1/users and GET /api/v1/users/{id}) are accessible to any authenticated user without admin/owner role verification, exposing all users' email addresses, roles, and account status.
Affected Endpoints
- GET /api/v1/users (UserController::index, line 94) — Lists ALL users with full details. No role check.
- GET /api/v1/users/{id} (UserController::show, line 126) — Shows any user's details by ID. No role check.
Root Cause (1-of-N Inconsistency)
Other methods in the same controller properly check for the 'owner' role:
store()—UserStoreRequest::authorize()checksauth()->user()->hasRole('owner')✓destroy()— Explicitly checks$this->repository->hasRole($admin, 'owner')✓
But index() and show() have no role check at all. The route group at routes/api.php:734-747 has no admin middleware, only the global auth:api middleware.
Exposed Data
The UserTransformer (line 40-54) returns:
email— user's email addressrole— user's role (owner/demo)blocked— account blocked statusblocked_code— block reasoncreated_at/updated_at— timestamps
Impact
Any authenticated user can:
- Enumerate ALL user accounts in the instance
- Harvest email addresses for phishing/social engineering
- Identify admin/owner accounts by role
- Determine which accounts are blocked
Exploitation
# List all users
curl -H "Authorization: Bearer <any_user_token>" https://instance/api/v1/users
# View specific user details
curl -H "Authorization: Bearer <any_user_token>" https://instance/api/v1/users/1
Suggested Fix
Add owner role checks to index() and show(), or restrict the route group with admin middleware:
// Option 1: Add check in controller methods
public function show(User $user): JsonResponse
{
if (!$this->repository->hasRole(auth()->user(), 'owner') && auth()->user()->id !== $user->id) {
throw new FireflyException('200025: No access to function.');
}
// ...
}
// Option 2: Add middleware to route group
Route::group(['middleware' => ['admin'], ...], ...)
Which versions are affected by GHSA-5q8v-j673-m5v4?
2 open source packages ship an affected version, including grumpydictator/firefly-iii.
| Package | Affected | Fixed in |
|---|---|---|
grumpydictator/firefly-iii Packagist | From 6.4.23 | 6.5.1 |
grumpydictator/firefly-iii Packagist | From 6.4.23 | 6.5.1 |
How do I fix GHSA-5q8v-j673-m5v4?
Upgrade grumpydictator/firefly-iii to 6.5.1 or later.
Upgrade, and check permissions on every request on the server, not only in the interface. More about Missing authorization.
Is GHSA-5q8v-j673-m5v4 being exploited?
There is no known exploitation of GHSA-5q8v-j673-m5v4 in the wild and no public exploit code.