CVE-2026-32104
StudioCMS: IDOR in User Notification Preferences Allows Any Authenticated User to Modify Any User's Settings
StudioCMS is a server-side-rendered, Astro native, headless content management system. Prior to 0.4.3, the updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity. This vulnerability is fixed in 0.4.3.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
5.4
StudioCMS: IDOR in User Notification Preferences Allows Any Authenticated User to Modify Any User's Settings
StudioCMS is a server-side-rendered, Astro native, headless content management system. Prior to 0.4.3, the updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity. This vulnerability is fixed in 0.4.3.
- Record
CVE-2026-32104- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
EUVDEUVD-2026-11373
5.4
StudioCMS is a server-side-rendered, Astro native, headless content management system. Prior to 0.4.3, the updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity. This vulnerability is fixed in 0.4.3.
- Record
EUVD-2026-11373- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-9v82-xrm4-mp52
5.4
StudioCMS: IDOR in User Notification Preferences Allows Any Authenticated User to Modify Any User's Settings
Summary
The updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity.
Details
The vulnerable handler is in packages/studiocms/frontend/pages/studiocms_api/_handlers/dashboard/users.ts:257-311:
.handle(
'updateUserNotifications',
Effect.fn(function* ({ payload: { id, notifications } }) {
// ...demo mode checks...
const [sdk, userData] = yield* Effect.all([SDKCore, CurrentUser]);
// Line 274: Only checks login + visitor level — any authenticated user passes
if (!userData.isLoggedIn || !userData.userPermissionLevel.isVisitor) {
return yield* new DashboardAPIError({ error: 'Unauthorized' });
}
// Line 280: Uses 'id' from payload — NOT userData.user.id
const existingUser = yield* sdk.GET.users.byId(id);
// Line 288: Updates target user using attacker-controlled 'id'
const updatedData = yield* sdk.AUTH.user.update({
userId: id, // ← attacker controls this
userData: {
id, // ← attacker controls this
name: existingUser.name,
username: existingUser.username,
updatedAt: new Date().toISOString(),
emailVerified: existingUser.emailVerified,
createdAt: undefined,
notifications, // ← attacker controls this
},
});
})
)
For comparison, the updateUserProfile handler in dashboard/profile.ts correctly uses userData.user.id instead of a user-supplied ID, preventing IDOR.
PoC
# 1. Log in as a visitor-role user, obtain session cookie
# 2. Disable all notifications for the admin user
curl -X POST 'http://localhost:4321/studiocms_api/dashboard/update-user-notifications' \
-H 'Cookie: studiocms-session=<visitor-session-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "<admin-user-id>",
"notifications": ""
}'
# Expected: 403 Forbidden
# Actual: 200 {"message":"User notifications updated successfully"}
Impact
- Any authenticated visitor can disable notification preferences for admin/owner accounts, suppressing alerts about new user creation, account changes, and user deletions
- Enables attack chaining — suppress admin notifications first, then perform other malicious actions with reduced detection risk
- Can modify any user's notification preferences (enable unwanted notifications or disable critical ones)
Recommended Fix
Add an ownership check in packages/studiocms/frontend/pages/studiocms_api/_handlers/dashboard/users.ts:
// After the login check at line 274, add:
if (id !== userData.user?.id && !userData.userPermissionLevel.isAdmin) {
return yield* new DashboardAPIError({
error: 'Unauthorized: cannot modify another user\'s notification preferences',
});
}
- Record
GHSA-9v82-xrm4-mp52- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
NVD
5.4
StudioCMS is a server-side-rendered, Astro native, headless content management system. Prior to 0.4.3, the updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity. This vulnerability is fixed in 0.4.3.
- Record
CVE-2026-32104- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
OSV
5.4
StudioCMS: IDOR in User Notification Preferences Allows Any Authenticated User to Modify Any User's Settings
StudioCMS is a server-side-rendered, Astro native, headless content management system. Prior to 0.4.3, the updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity. This vulnerability is fixed in 0.4.3.
- Record
CVE-2026-32104- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
OSVGHSA-9v82-xrm4-mp52
5.4
StudioCMS: IDOR in User Notification Preferences Allows Any Authenticated User to Modify Any User's Settings
Summary
The updateUserNotifications endpoint accepts a user ID from the request payload and uses it to update that user's notification preferences. It checks that the caller is logged in but never verifies that the caller owns the target account (id !== userData.user.id). Any authenticated visitor can modify notification preferences for any user, including disabling admin notifications to suppress detection of malicious activity.
Details
The vulnerable handler is in packages/studiocms/frontend/pages/studiocms_api/_handlers/dashboard/users.ts:257-311:
.handle(
'updateUserNotifications',
Effect.fn(function* ({ payload: { id, notifications } }) {
// ...demo mode checks...
const [sdk, userData] = yield* Effect.all([SDKCore, CurrentUser]);
// Line 274: Only checks login + visitor level — any authenticated user passes
if (!userData.isLoggedIn || !userData.userPermissionLevel.isVisitor) {
return yield* new DashboardAPIError({ error: 'Unauthorized' });
}
// Line 280: Uses 'id' from payload — NOT userData.user.id
const existingUser = yield* sdk.GET.users.byId(id);
// Line 288: Updates target user using attacker-controlled 'id'
const updatedData = yield* sdk.AUTH.user.update({
userId: id, // ← attacker controls this
userData: {
id, // ← attacker controls this
name: existingUser.name,
username: existingUser.username,
updatedAt: new Date().toISOString(),
emailVerified: existingUser.emailVerified,
createdAt: undefined,
notifications, // ← attacker controls this
},
});
})
)
For comparison, the updateUserProfile handler in dashboard/profile.ts correctly uses userData.user.id instead of a user-supplied ID, preventing IDOR.
PoC
# 1. Log in as a visitor-role user, obtain session cookie
# 2. Disable all notifications for the admin user
curl -X POST 'http://localhost:4321/studiocms_api/dashboard/update-user-notifications' \
-H 'Cookie: studiocms-session=<visitor-session-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "<admin-user-id>",
"notifications": ""
}'
# Expected: 403 Forbidden
# Actual: 200 {"message":"User notifications updated successfully"}
Impact
- Any authenticated visitor can disable notification preferences for admin/owner accounts, suppressing alerts about new user creation, account changes, and user deletions
- Enables attack chaining — suppress admin notifications first, then perform other malicious actions with reduced detection risk
- Can modify any user's notification preferences (enable unwanted notifications or disable critical ones)
Recommended Fix
Add an ownership check in packages/studiocms/frontend/pages/studiocms_api/_handlers/dashboard/users.ts:
// After the login check at line 274, add:
if (id !== userData.user?.id && !userData.userPermissionLevel.isAdmin) {
return yield* new DashboardAPIError({
error: 'Unauthorized: cannot modify another user\'s notification preferences',
});
}
- Record
GHSA-9v82-xrm4-mp52- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
Affected products
Affected packages
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-32104 is a medium vulnerability (CVSS 5.4) in Studiocms, published March 11, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.29%, the 21st percentile. Fixed in studiocms 0.4.3.