← Back to Feed CACHED · 2026-06-25 02:40:25 · CACHE_KEY tenable:11618
tenable:11618 · CWE-693 · Disclosed 2003-05-16

TCP/IP SYN+FIN Packet Filtering Weakness

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A 1998 firewall-evasion trick still showing up on 2026 scan reports like a fax machine in the server room

Tenable plugin 11618 fires when a host responds to a TCP segment that has both the SYN and FIN flags set simultaneously — an illegal flag combination that real TCP stacks should never emit. The original concern, documented by Uriel Maimon in *Phrack 49* (1996) and re-described in CVE-1999-0661 territory, was that early stateless packet filters and some ACL-based routers keyed their 'is this a new connection?' decision on the SYN bit alone, so an attacker could smuggle traffic past the filter by also setting FIN. The plugin checks the *host's* TCP stack behavior — does it accept the packet and reply — rather than the upstream filter, which is the actual issue. Affects: legacy BSD-derived stacks, some embedded TCP/IP implementations, and a long tail of network appliances; modern Linux (≥ 2.4), Windows (≥ XP SP2), and any iptables/nftables or stateful firewall with default rules drops these outright.

Tenable's MEDIUM rating is overstated for 2026 reality. There is no memory corruption, no auth bypass, no code execution — the worst-case outcome is that an attacker who is *already* able to send raw packets at your perimeter might evade a *stateless* ACL that you almost certainly aren't running. Anything past a 2005-vintage stateful firewall, any modern NGFW (Palo, Fortinet, Check Point, Cisco FTD), and the default Linux conntrack table all drop SYN+FIN. This belongs in the LOW / informational bucket on any honest risk register.

"1990s-era packet-filter trick. Modern stateful firewalls drop SYN+FIN by default. Backlog hygiene, not a fire drill."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Attacker positions to send crafted packets at the perimeter

The attacker needs the ability to inject raw TCP segments with arbitrary flag combinations toward the target network. This requires either an internet-reachable path to the perimeter device or an on-path foothold. Tooling: hping3 -S -F, scapy (IP()/TCP(flags='SF')), or nmap --scanflags SYNFIN.
Conditions required:
  • Network reachability to the target's external interface
  • Ability to spoof/craft raw IP packets (root or raw socket capability)
Where this breaks in practice:
  • Most ISPs egress-filter malformed flag combos via BCP38-adjacent hygiene
  • Cloud provider virtual networks (AWS VPC, Azure VNet, GCP VPC) drop illegal flag combos before they reach the tenant
Detection/coverage: Trivially flagged by Suricata/Snort default ruleset (STREAM_BAD_SYN), Zeek's weird.log, and any IDS with tcp_flags & (SYN|FIN) heuristics.
STEP 02

Attacker hopes the perimeter is a stateless ACL

For the trick to actually do anything useful, the device making the filtering decision must inspect only the SYN bit and not the full flag tuple — i.e., a stateless router ACL or an extremely old packet filter. Tooling: nmap -sS -sF --scanflags SYNFIN to probe filtered ports.
Conditions required:
  • Target sits behind a stateless packet filter, not a stateful firewall
  • Filter rule is written as 'permit established' using SYN-only semantics
Where this breaks in practice:
  • Virtually no enterprise runs a stateless perimeter in 2026
  • Even Cisco IOS established ACLs on modern IOS-XE versions check ACK as well, not just SYN
  • All major cloud security groups are stateful by definition
Detection/coverage: Stateful firewall logs show the malformed segment dropped. Plugin 11618 itself is the canonical detection.
STEP 03

Target stack accepts the SYN+FIN and responds

If the packet reaches the host, a compliant modern stack will either RST or silently drop. A legacy or embedded stack (some older BSD, Solaris < 8, certain IoT/printer/SCADA TCP stacks) may treat it as a SYN and reply with SYN-ACK, completing the evasion. This gains the attacker *one TCP connection setup* through the filter — equivalent to having no filter at all for that flow.
Conditions required:
  • Affected host runs a legacy or embedded TCP/IP stack
  • No host-based firewall (Windows Defender Firewall / iptables / pf) on the endpoint
Where this breaks in practice:
  • Modern Linux drops SYN+FIN via tcp_invalid_ratelimit and conntrack INVALID state
  • Windows TCP/IP stack since XP SP2 rejects illegal flag combos
  • Host-based EDR (CrowdStrike, SentinelOne, Defender) network filters drop early
Detection/coverage: EDR network telemetry, host firewall logs, and any NDR product (ExtraHop, Corelight, Vectra) will flag SYN+FIN as protocol anomaly.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo active exploitation. No KEV listing, no known campaign references this technique post-2005. Used in academic IDS-evasion papers only.
Proof-of-conceptTrivial — hping3 -S -F -p 80 <target> or scapy IP(dst='x')/TCP(flags='SF'). Documented since *Phrack 49* (1996).
EPSSNot tracked — this is a Tenable plugin ID, not a CVE. Closest analogue CVE-1999-0661 has effectively 0% EPSS.
KEV statusNot listed. Will never be — no CVE-class identifier.
CVSS interpretationTenable assigns CVSS2 AV:N/AC:L/Au:N/C:N/I:P/A:N ≈ 5.0. Under CVSS 3.1 this maps to roughly AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N3.7. Real-world ≈ 2.1 after friction.
Affected scopeHosts behind stateless packet filters running legacy TCP/IP stacks (pre-2002 BSD, Solaris ≤ 7, some embedded/ICS gear).
Fixed byAny stateful firewall with default deny on INVALID connection state. iptables: -m conntrack --ctstate INVALID -j DROP. nftables: ct state invalid drop.
Scanning/exposureShodan/Censys do not specifically track SYN+FIN responders. GreyNoise sees background SYN+FIN scan traffic at <0.01% of total noise — almost entirely academic scanners and Censys itself.
DisclosureOriginally documented 1996 (Phrack 49, *Project Loki* era). Tenable plugin 11618 published ~2003.
ReporterTenable Research; original technique attributed to *Uriel Maimon* / various Phrack contributors.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (2.1/10)

Decisive factor: the bug is in a 1990s-era filter-evasion assumption that no modern stateful firewall, no major cloud security group, and no current OS TCP stack honors. There is no code execution, no credential disclosure, no privilege change — the worst-case outcome is one TCP handshake evading a hypothetical stateless ACL that effectively no enterprise still runs at the perimeter.

HIGH Severity downgrade to LOW
HIGH Absence of active exploitation
MEDIUM Residual risk on embedded/ICS network gear

Why this verdict

  • No primitive worth the name: the 'win' is bypassing a stateless filter to reach one port — nothing about the bug grants RCE, auth bypass, or info disclosure on the endpoint itself.
  • Friction point — stateless filters are extinct: every NGFW, every cloud security group, and every default Linux conntrack policy drops SYN+FIN as INVALID. The bypass target essentially does not exist in 2026 enterprise architecture.
  • Friction point — modern stacks reject the packet: Windows ≥ XP SP2, Linux ≥ 2.4, and macOS all refuse to process SYN+FIN. The vulnerable population is narrow legacy/embedded gear.
  • Role multiplier — perimeter firewall: if the bug existed in your edge firewall's own stack, blast radius would still be 'evade one rule', not 'compromise the device' — the floor stays LOW.
  • Role multiplier — ICS/OT controllers: some PLCs and HMIs do run legacy stacks that respond to SYN+FIN, but OT networks should be air-gapped or behind a dedicated firewall that drops the packet upstream; blast radius is contained to the OT segment, not fleet-wide.
  • No KEV, no EPSS signal, no campaign telemetry: GreyNoise sees only research-grade SYN+FIN traffic. Threat actors moved on 20 years ago.

Why not higher?

MEDIUM would imply some realistic post-exploitation impact on a meaningful share of the installed base. Neither holds: the affected stack behavior gives the attacker no capability they don't already have if they can talk to the target, and the prerequisite stateless filter is a museum piece.

Why not lower?

Not IGNORE because legacy network appliances, embedded controllers, and OT gear genuinely do still ship with stacks that mishandle SYN+FIN, and a site running stateless ACL hardware (rare but extant in some carrier and SCADA environments) could see the documented evasion succeed. Document and clear at the next refresh cycle — don't pretend it's zero.

05 · Compensating Control

What to do — in priority order.

  1. Drop INVALID-state TCP at the perimeter and host firewalls — On Linux edge devices: iptables -A INPUT -m conntrack --ctstate INVALID -j DROP (or nftables ct state invalid drop). On Windows hosts, Windows Defender Firewall already discards malformed flag combos by default — verify it is enabled. On NGFWs, confirm 'TCP flag validation' / 'strict TCP' is on. No mitigation SLA — implement at next change window.
  2. Inventory legacy and embedded stacks — Use Nessus, Nmap (-O), or your CMDB to flag pre-2005 OS images, embedded appliances, printers, ICS controllers, and IP cameras. These are the only populations where plugin 11618 has any real teeth. Schedule them into the firmware/refresh program over the 365-day remediation window.
  3. Enable IDS protocol anomaly rules — Suricata: keep stream-event:bad_syn enabled. Zeek: review weird.log for bad_TCP_checksum/SYN_with_FIN. This buys you detection in the unlikely event an attacker tries the technique.
  4. Suppress the finding in your scanner with documented rationale — Mark Tenable plugin 11618 as accepted-risk on hosts that sit behind a verified stateful firewall. This reclaims dashboard attention for findings that matter.
What doesn't work
  • Patching the OS — there is nothing to patch on a modern stack; the behavior is already correct. Chasing a 'fix' here wastes cycles.
  • Rate-limiting at the WAF — Layer-7 WAFs don't see malformed L3/L4 flag combinations; they receive only what the L4 stack accepts.
  • Disabling TCP timestamps / TCP options — orthogonal to flag handling; doesn't affect SYN+FIN behavior.
  • Network segmentation alone — segmentation prevents reach, not the protocol behavior; without dropping INVALID state, an internal attacker still succeeds against the same legacy stack.
06 · Verification

Crowdsourced verification payload.

Run from an auditor workstation with raw-socket capability (root or CAP_NET_RAW) against the target host. Requires hping3 and nmap. Invocation example: sudo ./check_synfin.sh 10.0.0.42 22. Exit 0 = PATCHED (host/firewall correctly drops SYN+FIN), exit 1 = VULNERABLE, exit 2 = UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate verifier: Tenable plugin 11618 — SYN+FIN filtering weakness
# Usage: sudo ./check_synfin.sh <target-ip> <tcp-port>
set -u

TARGET="${1:-}"
PORT="${2:-80}"

if [[ -z "$TARGET" ]]; then
  echo "usage: $0 <target> <port>" >&2
  exit 2
fi

if ! command -v hping3 >/dev/null 2>&1; then
  echo "UNKNOWN: hping3 not installed" >&2
  exit 2
fi

if [[ $EUID -ne 0 ]]; then
  echo "UNKNOWN: must run as root (raw sockets)" >&2
  exit 2
fi

echo "[*] Baseline SYN probe to ${TARGET}:${PORT}"
BASELINE=$(hping3 -c 3 -S -p "$PORT" "$TARGET" 2>/dev/null | grep -c 'flags=SA')

echo "[*] Sending SYN+FIN to ${TARGET}:${PORT}"
# -S SYN, -F FIN -> illegal SF flag combination
SYNFIN=$(hping3 -c 5 -S -F -p "$PORT" "$TARGET" 2>/dev/null | grep -c 'flags=SA')

echo "[*] Baseline SYN-ACK responses : ${BASELINE}"
echo "[*] SYN+FIN SYN-ACK responses  : ${SYNFIN}"

if [[ "$BASELINE" -eq 0 ]]; then
  echo "UNKNOWN: port appears closed/filtered to plain SYN; cannot compare"
  exit 2
fi

if [[ "$SYNFIN" -gt 0 ]]; then
  echo "VULNERABLE: host or upstream filter accepted SYN+FIN (plugin 11618 condition)"
  exit 1
fi

echo "PATCHED: SYN+FIN dropped (modern stateful behavior)"
exit 0
07 · Bottom Line

If you remember one thing.

TL;DR
Treat plugin 11618 as backlog hygiene, not a fire drill. Since the reassessed verdict is LOW, there is no noisgate mitigation SLA — go straight to the noisgate remediation SLA of ≤ 365 days: confirm your perimeter and host firewalls drop INVALID-state TCP, inventory any pre-2005 OS images / embedded controllers / ICS gear where this behavior could still exist, suppress the finding on hosts demonstrably behind a stateful firewall, and roll the legacy-stack remnants into your normal firmware-refresh program. On Monday morning, the only concrete action is to run the verifier above against a representative sample and add a documented exception in Tenable for hosts that come back PATCHED. Do not let this finding push real CRITICAL/HIGH CVEs out of your patch queue.

Sources

  1. Tenable plugin 11618 detail
  2. Phrack 49 — TCP/IP flag manipulation primer
  3. CVE-1999-0661 (related SYN+FIN handling)
  4. Linux netfilter conntrack INVALID state semantics
  5. Suricata stream-events documentation (bad_syn / SYN with FIN)
  6. RFC 793 — Transmission Control Protocol (flag semantics)
  7. Nmap scan techniques — SYN/FIN flag scanning
  8. Cisco IOS stateful inspection / established ACL behavior
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.