By Manny Fernandez

November 10, 2026

CVE-2026-19868: SonicWall SAML MFA Bypass on SSLVPN, Patch and Hunt Guide

CVE-2026-19868: SonicWall SAML MFA Bypass on SSLVPN, Patch and Hunt Guide

InfoSecMonkey | No fluff. Just the config that works.

Executive Summary

CVE-2026-19868 is a SonicWall SAML MFA bypass in the SonicOS SSLVPN service, and it is being exploited in the wild. If your SSLVPN login is SAML-backed (Entra ID, Okta, FortiAuthenticator, any IdP) and the firewall still accepts some other authentication method, a person holding a password for that other method can get a VPN session without your identity provider ever seeing the login and without an MFA prompt ever firing.

SonicWall fixed it on November 6, 2026 in advisory SNWLID-2026-0014 and says there is no workaround. CISA added it to the Known Exploited Vulnerabilities catalog the same day, with a November 20, 2026 deadline for US federal civilian agencies (Help Net Security). Treat that date as your deadline too.

  • Objective: confirm whether you are exposed, contain it if you cannot patch today, upgrade SonicOS, and hunt for sessions that already slipped past SAML.
  • Target audience: firewall admins, MSPs and SOC analysts who run or monitor SonicWall Gen7 or Gen8 SSLVPN.
  • Time to complete: about 30 minutes to confirm and contain, one maintenance window to upgrade, and an hour for the log hunt.

At a glance

Item Detail
CVE CVE-2026-19868
Product SonicOS SSLVPN service, Gen7 and Gen8 firewalls
Weakness CWE-308, Use of Single-factor Authentication
Vendor CVSS 7.1 High (AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:N)
NVD (CISA ADP) 7.5 High
Exploited Yes. Listed in CISA KEV on November 6, 2026
KEV due date November 20, 2026
Exposure condition SAML enabled for SSLVPN logins
Workaround None. Upgrade is the only fix
Reported by Ryan Harris, The Electronic Office

Scores and credit per SecurityWeek and nFlo.

How the SonicWall SAML MFA Bypass Works

Most shops moved SSLVPN to SAML for one reason: to force every VPN login through the IdP, where MFA and conditional access live. Local users, LDAP, RADIUS or TACACS+ often stay configured on the box for admins, legacy groups, or break-glass access.

CVE-2026-19868 breaks the enforcement between those two worlds. SonicWall describes it as an authentication enforcement flaw where a user with valid credentials for an alternate authentication method may bypass SAML authentication controls, and with them any MFA the SAML flow enforced (SecurityWeek). The SSLVPN service is supposed to insist on SAML. It does not.

Figure 1: Intended path vs. the bypass path

Intended SAML and MFA login path compared with the CVE-2026-19868 alternate-credential bypass path on SonicWall SSLVPN

Two things to keep straight:

  • It is not unauthenticated. The attacker needs a working password for some non-SAML method. That is a low bar: VPN credentials are cheap on access markets, and this is exactly the scenario SAML-enforced MFA was supposed to neutralize.
  • Your IdP logs are blind to it. A bypassed login never reaches the IdP, so there is no sign-in event and no push to the user’s phone. The firewall’s own SSLVPN log is the only record, which is why the hunt in Step 5 compares the two.

This is not the first time. In 2025, Akira affiliates got into SonicWall firewalls that had OTP-based MFA enabled, and attackers were seen exploiting CVE-2024-12802, another SonicWall SSLVPN MFA bypass, earlier in 2026 (Help Net Security). Neither SonicWall nor CISA has published IoCs or attack details for CVE-2026-19868, and SonicWall has not said which alternate methods are involved. Treat every non-SAML method on the box as in scope.

Affected and Fixed Versions

Generation Models Vulnerable Fixed
Gen7 TZ, NSa, NSsp, NSv 7.3.3-7015 and older 7.3.4-7013 or later
Gen8 TZ, NSa, NSv 8.2.2-8015 and older 8.2.3-8015 or later

Version data per SecurityWeek and Help Net Security. Gen6 is not listed as affected, but Gen6 is end of support and SonicWall advises moving to Gen8. Deployments without SAML on SSLVPN are not exposed to this CVE, but they still need the upgrade because the same advisory fixes six other flaws.

The other six flaws in SNWLID-2026-0014

None of these are flagged as exploited, but they ride the same upgrade (SecurityWeek, nFlo):

  • Two management-interface bugs rated 8.8, a permissive cross-domain policy issue and a session validation issue, either of which can let a remote attacker take unauthorized actions without logging in under certain conditions.
  • Three pre-authentication buffer overflows in the SSLVPN service and the TACACS+ authentication client that can knock the service over (DoS).
  • Weak password hashing on virtual appliances that lets someone with high-privilege local access recover a platform credential.

The management-interface pair is one more reason the SonicOS admin UI should never face the internet.

Prerequisites and Architecture

  • Assumed knowledge: SonicOS admin UI basics, how your SSLVPN authentication is set up, and how to export logs from your IdP.
  • Access needed: firewall admin rights, a MySonicWall account for firmware, read access to IdP sign-in logs, and Python 3.8 or later for the hunt script.
  • Change window: the upgrade reboots the firewall. Plan it, and keep a console or out-of-band path handy.
Component Lab value Role
SonicWall Gen7 or Gen8 WAN 198.18.0.10, SSLVPN on TCP 4433 SSLVPN gateway (SAML SP)
Identity provider Entra ID, Okta, FortiAuthenticator SAML IdP enforcing MFA
Trusted admin egress 198.18.10.0/24 Only sources allowed to reach SSLVPN while unpatched
Admin workstation 10.0.10.50 Runs the checks and the hunt script
Internal LAN 10.0.0.0/16 What a bypassed session can reach

Step-by-Step Response

Step 1: Confirm firmware and generation

Goal: know in two minutes whether each firewall is on a vulnerable build.

Action: SSH to the management interface and read the version, or check the dashboard. Do this for every SonicWall, including NSv instances in ESX, KVM, Hyper-V, AWS and Azure.

admin@<FW-NAME>> show version

GUI verification: the firmware version shows on the device dashboard’s system panel. Compare it with the table above. If you manage the fleet through NSM, export the inventory and filter on the firmware column.

Step 2: Confirm SAML is in the SSLVPN path and inventory every other method

Goal: decide whether CVE-2026-19868 applies, and find every credential that could be used for the bypass.

Action: in the SSLVPN and user authentication settings, confirm whether SAML is the login method for SSLVPN users. Then list every other method the box will accept: local users, LDAP or Active Directory, RADIUS, and TACACS+. Note which accounts can authenticate through each one. Menu names shift between 7.x and 8.x builds, so go by the setting rather than the path.

While you are there, check what the internet can actually reach. Run this from outside your network:

nmap -Pn -p 443,4433 --open 198.18.0.10
curl -skI https://198.18.0.10:4433/ | head -n 5

GUI verification: you end the step with a short written list: SAML on or off for SSLVPN, every alternate method, and every account each method can authenticate. That list drives Steps 3 and 6.

Step 3: Contain it if you cannot patch today

Goal: shrink exposure until the maintenance window. There is no vendor workaround, so these reduce risk rather than remove it.

  • Restrict the portal by source. Allow SSLVPN only from known egress ranges (198.18.10.0/24 in the lab) with an access rule on the WAN zone. Opportunistic credential stuffing goes away.
  • Strip alternate methods from VPN users. Remove local, LDAP or RADIUS access for any account that should only ever log in through SAML. Keep documented break-glass accounts with long random passwords.
  • Consider taking WAN SSLVPN offline if the user base can tolerate it, per nFlo.
  • Do not turn SAML off as a fix. That kills the bypass by removing MFA for everyone, which is worse.

GUI verification: re-run the Step 2 nmap from an address outside the allowed range. Port 4433 should not answer.

Step 4: Upgrade SonicOS

Goal: land on 7.3.4-7013 or later (Gen7) or 8.2.3-8015 or later (Gen8).

Action: export a configuration backup and take a settings snapshot, download the firmware from MySonicWall, upload it, and boot to the new image with current configuration. HA pairs follow your usual secondary-first process.

admin@<FW-NAME>> show version
# expect 7.3.4-7013 or later (Gen7), 8.2.3-8015 or later (Gen8)

GUI verification: the dashboard firmware version matches the fixed build, and SSLVPN users can still sign in through the IdP.

Step 5: Hunt for logins that skipped the IdP

Goal: find sessions that already used the bypass. Patched does not mean clean.

Action: export SSLVPN login events from the firewall (or your SIEM, if SonicOS syslog is forwarded) for at least the last 30 days, and export IdP sign-ins for the same window. Every legitimate SAML login produces an IdP sign-in just before the VPN session starts. A VPN login with no IdP sign-in in the preceding two minutes is the signal (Help Net Security).

This script does the correlation. It strips DOMAIN\ and @domain so usernames line up, converts both sides to UTC, and prints every unmatched VPN login as CSV. Set the column names to match your exports.

#!/usr/bin/env python3
"""Flag SonicWall SSLVPN logins that have no matching IdP sign-in.

Usage:
  python3 vpn_idp_gap.py vpn_logins.csv idp_signins.csv \
    --vpn-user-col User --vpn-time-col Time --vpn-utc-offset -5 \
    --idp-user-col UserPrincipalName --idp-time-col CreatedDateTime \
    --window 120 --exclude breakglass1,breakglass2 > unmatched.csv
"""
import argparse
import csv
import sys
from datetime import datetime, timedelta, timezone

FORMATS = ("%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%SZ",
           "%m/%d/%Y %H:%M:%S", "%m/%d/%Y %I:%M:%S %p")


def norm_user(raw):
    user = raw.strip().lower()
    user = user.split("\\")[-1]      # DOMAIN\user -> user
    return user.split("@")[0]       # user@corp.com -> user


def parse_ts(raw, utc_offset):
    raw = raw.strip()
    try:
        ts = datetime.fromisoformat(raw.replace("Z", "+00:00"))
    except ValueError:
        ts = None
        for fmt in FORMATS:
            try:
                ts = datetime.strptime(raw, fmt)
                break
            except ValueError:
                continue
        if ts is None:
            raise ValueError("unparsed timestamp: " + raw)
    if ts.tzinfo is None:
        ts = ts.replace(tzinfo=timezone(timedelta(hours=utc_offset)))
    return ts.astimezone(timezone.utc)


def load(path, user_col, time_col, utc_offset):
    rows = []
    with open(path, newline="", encoding="utf-8-sig") as f:
        for r in csv.DictReader(f):
            if not r.get(user_col) or not r.get(time_col):
                continue
            rows.append((norm_user(r[user_col]),
                         parse_ts(r[time_col], utc_offset), r))
    return rows


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("vpn_csv")
    ap.add_argument("idp_csv")
    ap.add_argument("--vpn-user-col", default="User")
    ap.add_argument("--vpn-time-col", default="Time")
    ap.add_argument("--vpn-utc-offset", type=float, default=0.0)
    ap.add_argument("--idp-user-col", default="UserPrincipalName")
    ap.add_argument("--idp-time-col", default="CreatedDateTime")
    ap.add_argument("--idp-utc-offset", type=float, default=0.0)
    ap.add_argument("--window", type=int, default=120,
                    help="seconds before the VPN login to look for an IdP sign-in")
    ap.add_argument("--exclude", default="",
                    help="comma-separated documented break-glass users")
    a = ap.parse_args()

    skip = {norm_user(u) for u in a.exclude.split(",") if u.strip()}
    vpn = load(a.vpn_csv, a.vpn_user_col, a.vpn_time_col, a.vpn_utc_offset)
    idp = load(a.idp_csv, a.idp_user_col, a.idp_time_col, a.idp_utc_offset)

    by_user = {}
    for user, ts, _ in idp:
        by_user.setdefault(user, []).append(ts)

    before = timedelta(seconds=a.window)
    after = timedelta(seconds=30)  # tolerate small clock drift
    out = csv.writer(sys.stdout)
    out.writerow(["vpn_user", "vpn_login_utc", "nearest_idp_signin_utc"])
    flagged = 0
    for user, ts, _ in sorted(vpn, key=lambda x: x[1]):
        if user in skip:
            continue
        hits = by_user.get(user, [])
        if any(ts - before <= h <= ts + after for h in hits):
            continue
        nearest = min(hits, key=lambda h: abs(h - ts)) if hits else None
        out.writerow([user, ts.isoformat(),
                      nearest.isoformat() if nearest else "none"])
        flagged += 1

    print("Checked %d VPN logins, %d with no IdP sign-in in %ds"
          % (len(vpn), flagged, a.window), file=sys.stderr)
    return 1 if flagged else 0


if __name__ == "__main__":
    sys.exit(main())
python3 vpn_idp_gap.py vpn_logins.csv idp_signins.csv \
  --vpn-user-col User --vpn-time-col Time --vpn-utc-offset -5 \
  --idp-user-col UserPrincipalName --idp-time-col CreatedDateTime \
  --window 120 --exclude breakglass1 > unmatched.csv

GUI verification: the script prints a summary line to the terminal and exits 1 if anything was flagged. Each row in unmatched.csv is a session to investigate: source IP, what it touched, and whether the user recognizes it.

Step 6: Rotate credentials and kill sessions

Goal: remove the prerequisite for the bypass and evict anyone already in.

  • Reset passwords for every account that can authenticate by a non-SAML method on the firewall, plus LDAP bind accounts and RADIUS shared secrets.
  • Terminate active SSLVPN sessions after the upgrade so everyone re-authenticates through SAML.
  • For every flagged session from Step 5, reset that account and review what it accessed on 10.0.0.0/16.

Verification and Validation

Check How Expected success
Firmware show version or the dashboard 7.3.4-7013+ (Gen7) or 8.2.3-8015+ (Gen8)
Bypass closed Try a test account’s local password at the SSLVPN portal Login refused or redirected to the IdP, no session
Normal path Sign in as a SAML user IdP sign-in and MFA event, then a VPN session
Hunt clean Re-run the script for the post-patch window Checked N VPN logins, 0 with no IdP sign-in in 120s
Exposure nmap from an untrusted source 4433 filtered if you kept the source restriction

Run the bypass test only with a dedicated test account, in a window you announced to the SOC.

Troubleshooting and Gotchas

The fixed Gen7 build number looks lower

Vulnerable is 7.3.3-7015, fixed is 7.3.4-7013. If a script or a tired admin compares the build suffix alone, 7013 looks older than 7015. Compare the release (7.3.4 vs. 7.3.3) first. Some secondary bulletins also print the Gen8 line differently (the Canadian Cyber Centre bulletin lists versions before 8.2.2-8015). Go by the vendor’s fixed build: 8.2.3-8015.

Every VPN login shows up as unmatched

Almost always a time zone or username format mismatch. Firewall exports are often local time while IdP exports are UTC. Set --vpn-utc-offset (for example -5 for Eastern standard time), and confirm NTP is healthy on the firewall. If usernames differ beyond domain prefixes and suffixes, map them before running the script.

head -n 3 vpn_logins.csv idp_signins.csv

Break-glass and service accounts trip the hunt

Documented local or RADIUS accounts will never have an IdP event. Pass them in --exclude, but only after you confirm each one is still needed, and review their sessions by hand. An undocumented account on that list is a finding, not noise.

Patched but still compromised

The upgrade closes the hole. It does not log anyone out or expire stolen passwords. Skipping Step 6 leaves an attacker who got in before November 6 sitting on a valid session or a valid password.

The Takeaway for Any VPN

The lesson is bigger than one vendor. If MFA lives at the IdP, every path into the VPN has to go through the IdP. Remove local and directory fallbacks for remote access, keep break-glass accounts few and watched, and alert on any VPN session that has no matching IdP sign-in. That correlation catches this CVE, and the next one like it.

Sources

InfoSecMonkey | No fluff. Just the config that works.

Recent posts

  • If you've spent any time configuring user authentication on... Full Story

  • DNS is one of those technologies that quietly underpins... Full Story

  • BGP issues on FortiGate firewalls usually trace back to... Full Story

  • Every time your laptop talks to your router, a... Full Story

  • If you've spent any time configuring NAT on a... Full Story

  • If you have spent any time configuring firewall policies... Full Story

  • High availability on FortiGate is one of those features... Full Story

  • If you've configured SD-WAN on a FortiGate, you've almost... Full Story

  • FortiLink is the management protocol that turns a FortiSwitch... Full Story

  • FortiSwitches are pretty rock solid from Mean Time Between... Full Story

  • This is a quicky tip.  Have you ever gone... Full Story

  • DNS is one of those quiet pieces of internet... Full Story

  • This article is an updated version of the previous... Full Story

  • You will add ns2 as a secondary (slave) BIND9... Full Story

  • In the process of deploying my lab, I needed... Full Story

  • RFC 8805, used to be known as Self-Correcting IP... Full Story

  • Years back, I wrote an article about certificate pinning. ... Full Story

  • FortiGates have the ability to send alerts to Microsoft... Full Story

  • In this post, I am going to walk through... Full Story

  • Troubleshooting VoIP on a FortiGate can feel like trying... Full Story

  • Prior to FortiOS 7.0, there were three commands to... Full Story

  • In this post, I am going to go over... Full Story

  • What we are going to do:  We are going... Full Story

  • Choosing between FGCP (FortiGate Clustering Protocol) and FGSP (FortiGate... Full Story

  • Creating a VLAN on macOS (The "Pro" Move) A... Full Story

  • This blog post explores the logic behind how macOS... Full Story

  • Pretty Fly for a Wi-Fi Tell My Wi-Fi Love... Full Story

  • Part of my daily gig is creating BoMs (Bill-of-Materials)... Full Story

  • ICMP introduces several security risks, but careful filtering, rate... Full Story

  • The command diag debug application dhcps -1 enables full... Full Story

  • In the world of FortiOS, execute tac report is... Full Story

  • LLDP; What is it The Link Layer Discovery Protocol... Full Story

  • What it actually does When you run diagnose fdsm... Full Story

  • Monkey Bites are bite-sized, high-impact security insights designed for... Full Story

  • I have run macOS in macOS with Parallels but... Full Story

  • Don't be confused with my other FortiNAC posts where... Full Story

  • This is the third session in a multi-part article... Full Story

  • Today I was configuring key-based authentication on a FortiGate... Full Story

  • Netcat, often called the "Swiss Army knife" of networking,... Full Story

  • At its core, IEEE 802.1X is a network layer... Full Story

  • In case you did not see the previous FortiNAC... Full Story

  • This is our 5th session where we are going... Full Story

  • Now that we have Wireshark installed and somewhat configured,... Full Story

  • The Philosophy of Packet Analysis Troubleshooting isn't about looking... Full Story

  • nmap Companion Tools: The Command-Line Ecosystem That Reads Your... Full Story

  • CVE-2026-19868: SonicWall SAML MFA Bypass on SSLVPN, Patch and... Full Story

  • No fluff. Just the config that works. Objective: The... Full Story