Skip to content
Heist/ feed
Back to feed
Medium

OPNsense: Stored XSS in Firewall Rules/NAT pages via a HTML-attribute breakout

Type: advisorySources: OSV

OPNsense is a FreeBSD based firewall and routing platform. Prior to version 26.1.11, Firewall Rules and NAT views place stored category names and alias descriptions into HTML title attributes in filter_rule.volt and nat_rule.volt without quote-safe encoding. The response layer uses ENT_NOQUOTES, so a double quote survives and closes the attribute, allowing an event-handler attribute to be added to the existing span. A user with Firewall Categories or Firewall Alias Edit privileges can store a category name or alias description; the category must be assigned to a filter or NAT rule, or the alias must be referenced by a rule source or destination, and the rule must be saved so the affected tooltip is rendered. Script then executes in the session of an administrator or other user who opens the affected Rules or NAT page. The script can access CSRF material and perform authenticated actions as the victim. This issue is fixed in version 26.1.11.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-58391
Confirmed fixed CVEs
Not specified
Updated in this feed
6 Nov 2026, 01:35 UTC · Revision 1

Source evidence

OPNsense: Stored XSS in Firewall Rules/NAT pages via a HTML-attribute breakout

core-osv · Original source

Published 15 Oct 2026, 15:12 UTC

OPNsense is a FreeBSD based firewall and routing platform. Prior to version 26.1.11, Firewall Rules and NAT views place stored category names and alias descriptions into HTML title attributes in filter_rule.volt and nat_rule.volt without quote-safe encoding. The response layer uses ENT_NOQUOTES, so a double quote survives and closes the attribute, allowing an event-handler attribute to be added to the existing span. A user with Firewall Categories or Firewall Alias Edit privileges can store a category name or alias description; the category must be assigned to a filter or NAT rule, or the alias must be referenced by a rule source or destination, and the rule must be saved so the affected tooltip is rendered. Script then executes in the session of an administrator or other user who opens the affected Rules or NAT page. The script can access CSRF material and perform authenticated actions as the victim. This issue is fixed in version 26.1.11.

osv:CVE-2026-58391
Complete source record
{
  "id": "ba8751cd32b13b47975cf4fa2da25510a74a0c53ea81e783981addebd0af75c5",
  "url": "https://osv.dev/vulnerability/CVE-2026-58391",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "OPNsense: Stored XSS in Firewall Rules/NAT pages via a HTML-attribute breakout",
    "summary": "OPNsense is a FreeBSD based firewall and routing platform. Prior to version 26.1.11, Firewall Rules and NAT views place stored category names and alias descriptions into HTML title attributes in filter_rule.volt and nat_rule.volt without quote-safe encoding. The response layer uses ENT_NOQUOTES, so a double quote survives and closes the attribute, allowing an event-handler attribute to be added to the existing span. A user with Firewall Categories or Firewall Alias Edit privileges can store a category name or alias description; the category must be assigned to a filter or NAT rule, or the alias must be referenced by a rule source or destination, and the rule must be saved so the affected tooltip is rendered. Script then executes in the session of an administrator or other user who opens the affected Rules or NAT page. The script can access CSRF material and perform authenticated actions as the victim. This issue is fixed in version 26.1.11.",
    "evidence": "osv:CVE-2026-58391",
    "products": [],
    "severity": "medium",
    "structured": {
      "id": "CVE-2026-58391",
      "aliases": [
        "CVE-2026-58391",
        "GHSA-2xrm-p255-p43h"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/opnsense/core",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "c930ab586ffe2d2e010e5135657e5e054316ff58"
                },
                {
                  "fixed": "5e6313f50546474031805039e209830b63b2b0e4"
                },
                {
                  "fixed": "fb3b8a07f407ce281b1dde748706acbb0bc514ce"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "26.1.11"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StringRangeExpression"
                  },
                  {
                    "range": [
                      {
                        "fixed": "5e6313f50546474031805039e209830b63b2b0e4"
                      }
                    ],
                    "source": "REFERENCES_COMMIT"
                  },
                  {
                    "range": [
                      {
                        "fixed": "fb3b8a07f407ce281b1dde748706acbb0bc514ce"
                      }
                    ],
                    "source": "REFERENCES_COMMIT"
                  }
                ]
              }
            }
          ],
          "versions": [
            "26.1.10",
            "26.1.9",
            "26.7.b",
            "26.1.8",
            "26.1.6",
            "26.1.7",
            "26.1.5",
            "26.1.4",
            "26.1.3",
            "26.1.2",
            "26.1.1",
            "26.1",
            "26.7.a",
            "26.1.r2",
            "26.1.r1",
            "26.1.r",
            "26.1.b",
            "26.1.a",
            "25.7.r",
            "25.7.b",
            "25.7.a",
            "25.1.r",
            "25.1.b",
            "25.1.a",
            "24.7.r",
            "24.7.b",
            "24.7.a",
            "24.1.r",
            "24.1.b",
            "24.1.a",
            "23.7.r",
            "23.7.b",
            "23.7.a",
            "23.1.r",
            "23.1.b",
            "23.1.a",
            "22.7.r",
            "22.7.b",
            "22.7.a",
            "22.1.r",
            "22.1.b",
            "22.1.a",
            "21.7.r",
            "21.7.b",
            "21.7.a",
            "21.1.r",
            "21.1.b",
            "21.1.a",
            "20.7.r",
            "20.7.b",
            "20.7.a",
            "20.1.r",
            "20.1.b",
            "20.1.a",
            "19.7.r",
            "19.7.b",
            "19.7.a",
            "19.1.r",
            "19.1.b",
            "19.1.a",
            "18.7.r",
            "18.7.b",
            "18.7.a",
            "18.1.r",
            "18.1.b",
            "18.1.a",
            "17.7.r",
            "17.7.b",
            "17.7.a",
            "17.1.r",
            "17.1.b",
            "17.1.a",
            "16.7.r",
            "16.7.b",
            "16.7.a",
            "15.7",
            "15.1.12",
            "15.1.11.4",
            "15.1.11.3",
            "15.1.11.2",
            "15.1.11.1",
            "15.1.11",
            "15.1.10.2",
            "15.1.10",
            "15.1.9.2",
            "15.1.9.1",
            "15.1.9",
            "15.1.8.4",
            "15.1.8.3",
            "15.1.8.2",
            "15.1.8.1",
            "15.1.8",
            "15.1.7.2",
            "15.1.7.1",
            "15.1.7",
            "15.1.6.1",
            "15.1.6",
            "15.1.5",
            "15.1.4",
            "15.1.3",
            "15.1.2",
            "15.1.1",
            "15.1"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-58391.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:45.788773337Z",
      "provider": "osv",
      "references": [
        "https://hackerask.com/posts/opnsense",
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/58xxx/CVE-2026-58391.json",
        "https://github.com/opnsense/core/security/advisories/GHSA-2xrm-p255-p43h",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-58391",
        "https://github.com/opnsense/core/commit/5e6313f50546474031805039e209830b63b2b0e4",
        "https://github.com/opnsense/core/commit/fb3b8a07f407ce281b1dde748706acbb0bc514ce"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-79",
          "CWE-83"
        ],
        "cna_assigner": "GitHub_M",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/58xxx/CVE-2026-58391.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-58391",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 513910,
  "published_at": "2026-10-15T15:12:08.334+00:00"
}