← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
tenable:25926 · CWE-200 · Disclosed 2007-08-22

Sybase ASA Client Connection Broadcast Remote Information Disc

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is a nameplate on the server-room door, not a key under the mat

Tenable plugin 25926 is flagging SQL Anywhere / Adaptive Server Anywhere servers that answer client discovery broadcasts. When broadcast listening is enabled, a host on the same LAN can elicit connection metadata such as the server name, port, version, and sometimes database names. This is not tied to a narrow broken build; SAP/Sybase documentation shows the behavior across older ASA 9.x and later SQL Anywhere releases whenever the default broadcast listener remains enabled instead of using -sb 0 or BroadcastListener=NO.

The vendor's MEDIUM label is too generous for enterprise patch triage. The decisive friction is attacker position: the actor already needs access to the same broadcast domain or internal subnet, and the payoff is only reconnaissance metadata rather than credential theft, code execution, or direct record exposure. Treat it as configuration hygiene on legacy flat networks, not as an urgent vulnerability.

"This is LAN-only service discovery, not a patch-worthy remote compromise path."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Land on the same subnet

The attacker first needs layer-2 or at least same-broadcast-domain reachability to the SQL Anywhere host. This is already a post-initial-access condition in most enterprises, because internet scanners cannot meaningfully hit a LAN broadcast workflow.
Conditions required:
  • Internal network presence on the same VLAN/subnet, or equivalent routed access to the broadcast segment
  • UDP broadcast traffic to the SQL Anywhere listener is not blocked locally
Where this breaks in practice:
  • Requires prior compromise, rogue device access, VPN entry, or physical presence
  • Network segmentation, NAC, and isolated server VLANs sharply reduce reachable population
Detection/coverage: Look for unexpected hosts joining the segment via NAC/DHCP/switch telemetry; this step is outside the scope of the Tenable plugin itself.
STEP 02

Send a discovery broadcast

Using a safe discovery tool such as Nmap's broadcast-sybase-asa-discover or Nessus plugin sybase_asa_ping.nasl, the attacker sends the same style of broadcast used by legitimate client discovery. If the server is using the default broadcast listener, it replies with connection metadata.
Conditions required:
  • SQL Anywhere/ASA is listening for client connection broadcasts
  • Server was not started with -sb 0 and TCP/IP broadcast listening was not disabled with BroadcastListener=NO
Where this breaks in practice:
  • If -sb 0 is set, the server does not answer UDP broadcasts
  • Some deployments hide database names with -dh, reducing the recon value
Detection/coverage: Strong coverage: Nessus plugin 25926 detects this behavior remotely on-network, and Nmap has a dedicated broadcast discovery script. Passive monitoring can also flag unusual UDP/2638 discovery traffic.
STEP 03

Use the metadata for follow-on targeting

The reply gives the attacker a cleaner target profile: exact listener port, product/version hints, and sometimes database names. That can help with later credential attacks, selective scanning, or operator reconnaissance, but it does not itself bypass authentication or expose table contents.
Conditions required:
  • The attacker can reach the actual SQL Anywhere service after discovery
  • A separate weakness exists, such as weak credentials or another remotely exploitable bug
Where this breaks in practice:
  • This plugin stops at recon; it does not grant session establishment
  • Modern auth controls, segmentation, and monitoring still have to fail for impact to follow
Detection/coverage: Watch SQL Anywhere authentication failures and unusual client connection attempts after discovery traffic; EDR and network IDS should catch brute-force or follow-on probing better than the broadcast itself.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo credible evidence of active exploitation campaigns tied to this issue, and no CISA KEV listing. This looks like legacy recon behavior, not a live operator favorite.
Proof-of-concept availabilityPublic safe discovery tooling exists: Nmap's broadcast-sybase-asa-discover and Tenable's detection plugin demonstrate how trivial enumeration is once an attacker is on-LAN.
EPSSN/Ano CVE identifier surfaced for this finding, so there is no FIRST EPSS score to anchor likelihood.
KEV statusNot listed in the CISA KEV catalog. Practically, the absence of a CVE makes KEV tracking inapplicable here.
CVSS reality checkNo authoritative CVSS vector was found. If you forced a real-world vector, it would look closer to adjacent/internal recon with low confidentiality impact than to a true remotely exploitable server flaw.
Affected versionsBehavior spans Adaptive Server Anywhere 9.x through later SQL Anywhere releases when TCP/IP broadcast listening is enabled. Docs for ASA 9.0.2, SQL Anywhere 11.0.1, 12.0.1, and 17 all describe the broadcast listener behavior.
Fixed / hardened stateThere is no patch version to chase. Hardening is configuration-based: start the server with -sb 0 or BroadcastListener=NO; optionally use -dh to suppress database names in responses.
Exposure and scanning realityThis is LAN-scoped broadcast discovery, so internet census data from Shodan/Censys/GreyNoise is mostly irrelevant. Nmap explicitly documents the script as discovering servers on the LAN, which is the whole point.
Disclosure dateThe Tenable detection was published on 2007-08-22. That reinforces the age and stability of the behavior.
Reporter / tooling lineageDetection lineage is from Tenable (sybase_asa_ping.nasl) and Nmap script author Patrik Karlsson. This is well-understood enumeration behavior, not fresh vuln research.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to IGNORE (1.4/10)

The single biggest downgrade factor is attacker position: the actor already needs same-subnet/internal access to get any value from this. The impact ceiling is also low because the response exposes connection metadata for reconnaissance, not direct data access or code execution.

HIGH Behavior is configuration-driven and broadly documented by SAP/Sybase
HIGH Impact is limited to reconnaissance metadata disclosure
MEDIUM Real-world prevalence of exposed legacy SQL Anywhere broadcast listeners

Why this verdict

  • Adj -2.0 for attacker position: this is not unauthenticated internet reachability; it starts with internal/same-broadcast-domain access, which implies prior compromise or trusted-network presence.
  • Adj -1.5 for impact ceiling: the reply gives server name, port, version, and possibly database names — useful recon, but not credentials, records, or code execution.
  • Adj -1.0 for exposure population: broadcast discovery is LAN-scoped, so the reachable population is far smaller than a normal remote service bug and invisible to most internet-scale opportunistic scanning.

Why not higher?

There is no exploit chain here unless you add another failure after this one — weak auth, another remote bug, or already-compromised internal access. On its own, the finding is reconnaissance noise from a patch-management perspective, not an enterprise-severity incident driver.

Why not lower?

It is not literally zero-risk because a flat legacy network can leak server names, version hints, and database names to any internal foothold. That metadata can improve follow-on targeting, so the right posture is to document it as hardening debt rather than pretend it has no security relevance at all.

05 · Compensating Control

What to do — in priority order.

  1. Disable broadcast listening — Start SQL Anywhere with -sb 0 or set BroadcastListener=NO so the server stops answering UDP discovery. For an IGNORE verdict there is no formal SLA; do this during normal maintenance or when the service is next touched.
  2. Hide database names — Use -dh where supported so even if some discovery behavior remains, the response leaks less useful metadata. This is backlog hardening, not emergency work.
  3. Keep legacy database servers off user VLANs — Put SQL Anywhere hosts behind segmentation so only application tiers and admin jump paths can reach them. This directly kills the same-subnet prerequisite that makes the finding possible.
What doesn't work
  • A WAF does nothing here because this is not HTTP traffic.
  • Internet-facing exposure reviews are the wrong lens; the behavior is broadcast/LAN-local, so Shodan-style scanning will not tell you much.
  • Emergency patching is misplaced because there is no specific fixed build to roll out for this plugin finding.
06 · Verification

Crowdsourced verification payload.

Run this on the target SQL Anywhere host from an admin shell so it can inspect process command lines and local sockets. Invoke it as python3 check_sqlanywhere_broadcast.py; root/Administrator is recommended, otherwise the script may return UNKNOWN if the OS hides process details.

noisgate-verify.py
PYTHONREAD-ONLYSAFE
#!/usr/bin/env python3
"""
check_sqlanywhere_broadcast.py
Determine whether a local SQL Anywhere / Adaptive Server Anywhere instance
appears to answer client connection broadcasts.

Exit codes:
  0 = PATCHED
  1 = VULNERABLE
  2 = UNKNOWN
"""
import os
import platform
import re
import subprocess
import sys

SAFE_PATTERNS = [
    re.compile(r'(^|\s)-sb\s*0(\s|$)', re.I),
    re.compile(r'broadcastlistener\s*=\s*(no|0)', re.I),
    re.compile(r'(^|\s)-x\s+none(\s|$)', re.I),
]
RISKY_HINTS = [
    re.compile(r'(^|\s)-sb\s*1(\s|$)', re.I),
    re.compile(r'(^|\s)-x\s+.*tcpip', re.I),
    re.compile(r'dbsrv\d+|dbeng\d+', re.I),
]
PROC_NAME_RE = re.compile(r'dbsrv\d+|dbeng\d+|dbsrv|dbeng', re.I)


def run(cmd):
    try:
        return subprocess.check_output(cmd, stderr=subprocess.DEVNULL, text=True, shell=isinstance(cmd, str))
    except Exception:
        return ""


def get_processes():
    system = platform.system().lower()
    procs = []

    if system == 'windows':
        ps = run(['powershell', '-NoProfile', '-Command',
                  "Get-CimInstance Win32_Process | Select-Object ProcessId,Name,CommandLine | ConvertTo-Csv -NoTypeInformation"])
        for line in ps.splitlines()[1:]:
            parts = []
            cur = ''
            in_q = False
            for ch in line:
                if ch == '"':
                    in_q = not in_q
                elif ch == ',' and not in_q:
                    parts.append(cur)
                    cur = ''
                else:
                    cur += ch
            parts.append(cur)
            if len(parts) >= 3:
                name = parts[1].strip('"')
                cmd = parts[2].strip('"')
                if PROC_NAME_RE.search(name) or PROC_NAME_RE.search(cmd):
                    procs.append((name, cmd))
        return procs

    if os.path.isdir('/proc'):
        for pid in os.listdir('/proc'):
            if not pid.isdigit():
                continue
            cmdline_path = os.path.join('/proc', pid, 'cmdline')
            try:
                raw = open(cmdline_path, 'rb').read().replace(b'\x00', b' ').decode(errors='ignore').strip()
            except Exception:
                continue
            if raw and PROC_NAME_RE.search(raw):
                name = raw.split()[0]
                procs.append((name, raw))
        return procs

    ps = run(['ps', '-axo', 'command='])
    for line in ps.splitlines():
        if PROC_NAME_RE.search(line):
            name = line.split()[0] if line.split() else 'unknown'
            procs.append((name, line.strip()))
    return procs


def udp_2638_listener_present():
    outputs = [
        run(['ss', '-lunp']),
        run(['netstat', '-anu']),
        run(['lsof', '-nP', '-iUDP']),
        run(['powershell', '-NoProfile', '-Command', 'Get-NetUDPEndpoint | Format-Table -HideTableHeaders LocalPort'])
    ]
    for out in outputs:
        if re.search(r'(^|\D)2638(\D|$)', out):
            return True
    return False


def main():
    procs = get_processes()
    if not procs:
        print('UNKNOWN - no local dbsrv/dbeng process found')
        sys.exit(2)

    hardened = []
    risky = []

    for name, cmd in procs:
        cmd_norm = ' ' + cmd.strip() + ' '
        if any(p.search(cmd_norm) for p in SAFE_PATTERNS):
            hardened.append((name, cmd))
        elif any(p.search(cmd_norm) for p in RISKY_HINTS):
            risky.append((name, cmd))
        else:
            # Default server behavior in documented builds is to answer broadcasts unless disabled.
            risky.append((name, cmd))

    listener = udp_2638_listener_present()

    if risky and listener:
        print('VULNERABLE - SQL Anywhere process found without broadcast hardening and UDP/2638 listener detected')
        sys.exit(1)

    if risky and not listener:
        print('UNKNOWN - SQL Anywhere process found without explicit broadcast hardening, but UDP/2638 listener was not confirmed')
        sys.exit(2)

    if hardened:
        print('PATCHED - SQL Anywhere process appears hardened with -sb 0, BroadcastListener=NO, or local-only networking')
        sys.exit(0)

    print('UNKNOWN - unable to determine effective broadcast listener state')
    sys.exit(2)


if __name__ == '__main__':
    main()
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning, take this out of the urgent patch queue and close it as documented hardening debt unless you know you have flat internal networks with exposed legacy SQL Anywhere hosts. For an IGNORE verdict there is no noisgate mitigation SLA and no noisgate remediation SLA — document the rationale only; if the platform is still in service, fold -sb 0 / BroadcastListener=NO and optionally -dh into normal maintenance instead of spending emergency patch capacity here.

Sources

  1. Tenable Plugin 25926
  2. SAP Help: -sb Database Server Option
  3. Sybase SQL Anywhere 11.0.1: BroadcastListener protocol option
  4. Sybase SQL Anywhere 11.0.1: -sb server option
  5. Sybase SQL Anywhere 12.0.1: TCP/IP protocol
  6. Adaptive Server Anywhere 9.0.2 Administration Guide PDF
  7. SAP KBA 2217028: disable broadcast listener
  8. Nmap NSEDoc: broadcast-sybase-asa-discover
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.