CVE-2026-30959: @oneuptime/common OneUptime Has WhatsApp Resend Verification Vulnerability

MODERATE
Advisory Identifier: GHSA-cw6x-mw64-q6pv
Advisory Summary

CVE-2026-30959 is a MODERATE oneuptime has whatsapp resend verification vulnerability (CWE-639: Authorization Bypass Through User-Controlled Key) affecting @oneuptime/common libraries in the npm ecosystem. The issue involves oneuptime has whatsapp resend verification authorization bypass. Remediation is available by upgrading affected packages to version 10.0.21.

CVE-2026-30959 at a Glance

CVE Identifier CVE-2026-30959
GHSA Identifier GHSA-cw6x-mw64-q6pv
Severity MODERATE
CVSS v3.1 Base Score N/A
CWE Classification CWE-639: Authorization Bypass Through User-Controlled Key
Affected Product @oneuptime/common
Package Ecosystem npm
Published Date
Last Updated

How to Fix CVE-2026-30959

To remediate this vulnerability, upgrade all affected @oneuptime/common dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

@oneuptime/common fixed: 10.0.21
npm install @oneuptime/common@10.0.21
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

npm ls @oneuptime/common

How to Check if You Are Affected

To determine whether your Node.js application is affected by CVE-2026-30959, inspect your project dependencies using npm:

npm ls @oneuptime/common

Analyze the terminal output to locate any version of @oneuptime/common in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 10.0.21), your application is affected.

Note: The npm ls @oneuptime/common command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-639: Authorization Bypass Through User-Controlled Key, where the system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data. In @oneuptime/common, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### 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](https://github.com/OneUptime/oneuptime/Common/Server/API/UserWhatsAppAPI.ts#L129-L153) - Service: [UserWhatsAppService.ts](https://github.com/OneUptime/oneuptime/Common/Server/API/UserWhatsAppAPI.ts#L129-L153) - Verify ownership (present in verify endpoint for comparison): [UserWhatsAppAPI.ts](https://github.com/OneUptime/oneuptime/Common/Server/API/UserWhatsAppAPI.ts#L78-L87) ### 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

CVE-2026-30959 Affected @oneuptime/common Versions

1 component(s)
Fixed Versions:
10.0.21
Product / Package Ecosystem Affected Versions Fixed Version
@oneuptime/common
npm
< 10.0.21
10.0.21

References

Frequently Asked Questions

What is CVE-2026-30959?
CVE-2026-30959 is a security vulnerability in @oneuptime/common involving OneUptime has WhatsApp Resend Verification Authorization Bypass under CWE-639: Authorization Bypass Through User-Controlled Key.
Which @oneuptime/common versions are affected?
Affected versions include releases prior to 10.0.21 across affected packages: @oneuptime/common.
What version fixes CVE-2026-30959?
Upgrading to 10.0.21 (or the latest patched release for your respective branch) resolves the vulnerability.
Is @oneuptime/common affected?
Yes, @oneuptime/common is affected in releases prior to 10.0.21. Upgrade your dependency to 10.0.21 or later.
What CWE is associated with CVE-2026-30959?
CVE-2026-30959 is classified under CWE-639: Authorization Bypass Through User-Controlled Key (The system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data.).
How can I check npm dependencies for CVE-2026-30959?
Run the dependency tree command: 'npm ls @oneuptime/common'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-cw6x-mw64-q6pv",
  "modified" : "2026-03-10T18:45:24Z",
  "published" : "2026-03-10T01:15:30Z",
  "aliases" : [ "CVE-2026-30959" ],
  "summary" : "OneUptime has WhatsApp Resend Verification Authorization Bypass",
  "details" : "### Description  \n  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).\n\n### Affected Source  \n- Endpoint: [UserWhatsAppAPI.ts](https://github.com/OneUptime/oneuptime/Common/Server/API/UserWhatsAppAPI.ts#L129-L153)  \n- Service: [UserWhatsAppService.ts](https://github.com/OneUptime/oneuptime/Common/Server/API/UserWhatsAppAPI.ts#L129-L153)  \n- Verify ownership (present in verify endpoint for comparison): [UserWhatsAppAPI.ts](https://github.com/OneUptime/oneuptime/Common/Server/API/UserWhatsAppAPI.ts#L78-L87)\n\n\n### Full Code Lines (UserWhatsAppAPI.ts)\n\nResend path (authorization gap):\n\n```ts\n    this.router.post(\n      `${new this.entityType()\n        .getCrudApiPath()\n        ?.toString()}/resend-verification-code`,\n      UserMiddleware.getUserMiddleware,\n      async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {\n        try {\n          req = req as OneUptimeRequest;\n\n          if (!req.body.itemId) {\n            return Response.sendErrorResponse(\n              req,\n              res,\n              new BadDataException(\"Invalid item ID\"),\n            );\n          }\n\n          await this.service.resendVerificationCode(req.body.itemId);\n\n          return Response.sendEmptySuccessResponse(req, res);\n        } catch (err) {\n          return next(err);\n        }\n      },\n    );\n```\n\nVerify path (ownership check present):\n\n```ts\n          if (\n            item.userId?.toString() !==\n            (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()\n          ) {\n            return Response.sendErrorResponse(\n              req,\n              res,\n              new BadDataException(\"Invalid user ID\"),\n            );\n          }\n```\n\n## Prerequisites\n- Valid attacker account with access to a project\n- Attacker access token\n- A victim’s `UserWhatsApp` itemId belonging to the same project\n\n## Steps to Reproduce\n1. Set your attacker token:\n\n   ```bash\n   export ATK=\"Bearer <attacker-access-token>\"\n   ```\n\n2. Trigger resend for the victim’s item:\n\n   ```bash\n   curl -s -X POST \\\n     -H \"Content-Type: application/json\" \\\n     -H \"Authorization: $ATK\" \\\n     -d '{\"itemId\":\"<victim-userwhatsapp-id>\"}' \\\n     http://<host>/api/user-whats-app/resend-verification-code\n   ```\n\n## Expected/Observed Behavior\n- HTTP 200 with `{}` body and a new verification code sent to the victim’s phone\n- No checks confirm that `item.userId` equals the authenticated user’s ID for the resend path\n\n## Impact\n- Spam/DoS against victims’ phone numbers, social engineering pressure, and potential lockout flows due to repeated resends\n\n## Recommended Fix\n- Enforce ownership: `item.userId` must match the authenticated user\n- Add per-item and per-user rate limiting for resends",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:L"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "npm",
      "name" : "@oneuptime/common"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "10.0.21"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/OneUptime/oneuptime/security/advisories/GHSA-cw6x-mw64-q6pv"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-30959"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/OneUptime/oneuptime"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/OneUptime/oneuptime/releases/tag/10.0.21"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-285", "CWE-307", "CWE-639", "CWE-862" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-03-10T01:15:30Z",
    "nvd_published_at" : "2026-03-10T18:18:55Z"
  }
}