GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

GCVE-1988-2026-0155

Vulnerability from gna-1988 – Published: 2026-09-07 13:20 – Updated: 2026-09-11 08:13
VLAI
Title
[NotCVE-2026-0011] Nmap 7.99 and Earlier nselib/packet.lua Zero-Length TCP Option Infinite Loop Allows Remote Denial of Service
Summary
---------------------------------------------------------------------------- NotCVE Advisory — NotCVE-2026-0011 ---------------------------------------------------------------------------- [-] Summary: Nmap 7.99 and earlier contain a loop with an unreachable exit condition in the Packet:parse_options() method of nselib/packet.lua. A remote host that is the target of a scan can exhaust the memory of the scanning Nmap process and terminate it by replying with a packet that carries a zero-length header option. No authentication and no access to the scanning machine are required: the attacker only needs to be scanned. CVSS:3.1 6.5 (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H). [-] Affected: Nmap, versions 7.99 and earlier (nselib/packet.lua). Fixed in commit 7ef4ee0 (2026-06-11). That fix sits above the topmost release header in the CHANGELOG (Nmap 7.99 [2026-03-26]), so as of this writing it is present only in the development tree and no released version carrying it has been verified. [-] Technical Description: Packet:parse_options(offset, length) walks the option area with a cursor, opt_ptr, reading an option type t and, for any type other than 0 (End of Option List) or 1 (No-Operation), a length byte l taken from self:u8(offset + opt_ptr + 1). The cursor is then advanced by opt_ptr = opt_ptr + l. Before commit 7ef4ee0 the parser accepted l == 0 without validation, so the cursor never advanced and the "while opt_ptr < length" condition never became false. Because the loop body allocated a fresh table with options[op] = {} and incremented op on every pass, the non-terminating loop also grew a table without bound, and the Lua interpreter embedded in Nmap consumed memory until the process died. The options[op] = {} assignment was positioned before the length was validated, which is why the loop allocated rather than merely spinning. The method is reached from tcp_parse(), where the option area length derives from the TCP data offset field of the received packet. A remote peer therefore controls both the length of the option area and its contents. nselib/packet.lua is the packet-dissection library used by NSE scripts that capture and parse raw packets, so exploitation requires the operator to run a scan that loads such a script against a host the attacker controls. Nothing is persisted and the effect ends with the process, but the attacker can repeat it on every subsequent scan, so the host remains effectively unscannable by any script using this library. Commit 7ef4ee0 ("Stop parsing on a zero-length packet option") adds an "if l==0 then break end" guard before any allocation and moves the options[op] = {} initialisation to after that check. The CHANGELOG entry reads "[NSE][GH#3368] Fixed an out-of-memory issue in packet.lua when parsing a zero-length TCP header option." The step-by-step attack path, the reachability analysis of the IP options code path and the full write-up are published at the advisory URL below. Weaknesses: CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop') CWE-400: Uncontrolled Resource Consumption CWE-770: Allocation of Resources Without Limits or Throttling CAPEC-130: Excessive Allocation [-] Timeline: [28/07/2026] - NotCVE ID reserved. [28/07/2026] - Published as NotCVE-2026-0011. [-] Credit: Discovered by Maxim Suhanov (@errno_fail). [-] Full Details and Updates: https://notcve.org/notcve/NotCVE-2026-0011 [-] References: https://github.com/nmap/nmap/issues/3368 https://github.com/nmap/nmap/commit/7ef4ee030a0023fe22616387a000032e1a678b6a https://github.com/nmap/nmap/pull/3373 https://raw.githubusercontent.com/nmap/nmap/master/nselib/packet.lua https://raw.githubusercontent.com/nmap/nmap/master/CHANGELOG [-] About NotCVE: NotCVE (https://notcve.org) assigns public, timestamped NotCVE IDs to vulnerabilities not acknowledged by vendors. Vendor will not assign a CVE? Request a NotCVE: https://notcve.org/form/ · Contributors: https://notcve.org/hall/ _______________________________________________ Sent through the Full Disclosure mailing list https://nmap.org/mailman/listinfo/fulldisclosure Web Archives & RSS: https://seclists.org/fulldisclosure/
Severity
No CVSS data available.
Impacted products
Vendor Product Version CPE status
Nmap Nmap Affected: unknown
guessed Create a notification for this product.
Credits

{
  "containers": {
    "cna": {
      "affected": [
        {
          "product": "Nmap",
          "vendor": "Nmap",
          "versions": [
            {
              "status": "affected",
              "version": "unknown"
            }
          ]
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "advisories"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "----------------------------------------------------------------------------\nNotCVE Advisory \u2014 NotCVE-2026-0011\n----------------------------------------------------------------------------\n\n[-] Summary:\nNmap 7.99 and earlier contain a loop with an unreachable exit condition in\nthe Packet:parse_options() method of nselib/packet.lua. A remote host that\nis the target of a scan can exhaust the memory of the scanning Nmap process\nand terminate it by replying with a packet that carries a zero-length header\noption. No authentication and no access to the scanning machine are\nrequired: the attacker only needs to be scanned.\nCVSS:3.1 6.5 (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H).\n\n[-] Affected:\nNmap, versions 7.99 and earlier (nselib/packet.lua).\nFixed in commit 7ef4ee0 (2026-06-11). That fix sits above the topmost\nrelease header in the CHANGELOG (Nmap 7.99 [2026-03-26]), so as of this\nwriting it is present only in the development tree and no released version\ncarrying it has been verified.\n\n[-] Technical Description:\nPacket:parse_options(offset, length) walks the option area with a cursor,\nopt_ptr, reading an option type t and, for any type other than 0 (End of\nOption List) or 1 (No-Operation), a length byte l taken from\nself:u8(offset + opt_ptr + 1). The cursor is then advanced by\nopt_ptr = opt_ptr + l.\n\nBefore commit 7ef4ee0 the parser accepted l == 0 without validation, so the\ncursor never advanced and the \"while opt_ptr \u003c length\" condition never\nbecame false. Because the loop body allocated a fresh table with\noptions[op] = {} and incremented op on every pass, the non-terminating loop\nalso grew a table without bound, and the Lua interpreter embedded in Nmap\nconsumed memory until the process died. The options[op] = {} assignment was\npositioned before the length was validated, which is why the loop allocated\nrather than merely spinning.\n\nThe method is reached from tcp_parse(), where the option area length derives\nfrom the TCP data offset field of the received packet. A remote peer\ntherefore controls both the length of the option area and its contents.\nnselib/packet.lua is the packet-dissection library used by NSE scripts that\ncapture and parse raw packets, so exploitation requires the operator to run\na scan that loads such a script against a host the attacker controls.\n\nNothing is persisted and the effect ends with the process, but the attacker\ncan repeat it on every subsequent scan, so the host remains effectively\nunscannable by any script using this library.\n\nCommit 7ef4ee0 (\"Stop parsing on a zero-length packet option\") adds an\n\"if l==0 then break end\" guard before any allocation and moves the\noptions[op] = {} initialisation to after that check. The CHANGELOG entry\nreads \"[NSE][GH#3368] Fixed an out-of-memory issue in packet.lua when\nparsing a zero-length TCP header option.\"\n\nThe step-by-step attack path, the reachability analysis of the IP options\ncode path and the full write-up are published at the advisory URL below.\n\nWeaknesses:\nCWE-835: Loop with Unreachable Exit Condition (\u0027Infinite Loop\u0027)\nCWE-400: Uncontrolled Resource Consumption\nCWE-770: Allocation of Resources Without Limits or Throttling\nCAPEC-130: Excessive Allocation\n\n[-] Timeline:\n[28/07/2026] - NotCVE ID reserved.\n[28/07/2026] - Published as NotCVE-2026-0011.\n\n[-] Credit:\nDiscovered by Maxim Suhanov (@errno_fail).\n\n[-] Full Details and Updates:\nhttps://notcve.org/notcve/NotCVE-2026-0011\n\n[-] References:\nhttps://github.com/nmap/nmap/issues/3368\nhttps://github.com/nmap/nmap/commit/7ef4ee030a0023fe22616387a000032e1a678b6a\nhttps://github.com/nmap/nmap/pull/3373\nhttps://raw.githubusercontent.com/nmap/nmap/master/nselib/packet.lua\nhttps://raw.githubusercontent.com/nmap/nmap/master/CHANGELOG\n\n[-] About NotCVE:\nNotCVE (https://notcve.org) assigns public, timestamped NotCVE IDs to\nvulnerabilities not acknowledged by vendors. Vendor will not assign a CVE?\nRequest a NotCVE: https://notcve.org/form/ \u00b7 Contributors:\nhttps://notcve.org/hall/\n_______________________________________________\nSent through the Full Disclosure mailing list\nhttps://nmap.org/mailman/listinfo/fulldisclosure\nWeb Archives \u0026 RSS: https://seclists.org/fulldisclosure/"
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-400",
              "description": "CWE-400",
              "lang": "en",
              "type": "CWE"
            },
            {
              "cweId": "CWE-770",
              "description": "CWE-770",
              "lang": "en",
              "type": "CWE"
            },
            {
              "cweId": "CWE-835",
              "description": "CWE-835",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-11T08:13:27Z",
        "orgId": "4e2abfbf-4a2a-4b76-a4e0-d77c18ba156c",
        "shortName": "VULNARCHIVE"
      },
      "references": [
        {
          "tags": [
            "technical-description"
          ],
          "url": "https://vuln.freearchive.org/archive/full-disclosure/2026/Aug/112"
        },
        {
          "tags": [
            "technical-description"
          ],
          "url": "https://seclists.org/fulldisclosure/2026/Aug/112"
        },
        {
          "url": "https://github.com/nmap/nmap/commit/7ef4ee030a0023fe22616387a000032e1a678b6a"
        },
        {
          "url": "https://github.com/nmap/nmap/issues/3368"
        },
        {
          "url": "https://github.com/nmap/nmap/pull/3373"
        },
        {
          "url": "https://nmap.org/mailman/listinfo/fulldisclosure"
        },
        {
          "url": "https://notcve.org"
        },
        {
          "url": "https://notcve.org/form/"
        },
        {
          "url": "https://notcve.org/hall/"
        },
        {
          "url": "https://notcve.org/notcve/NotCVE-2026-0011"
        },
        {
          "url": "https://raw.githubusercontent.com/nmap/nmap/master/CHANGELOG"
        },
        {
          "url": "https://raw.githubusercontent.com/nmap/nmap/master/nselib/packet.lua"
        },
        {
          "url": "https://seclists.org/fulldisclosure/"
        }
      ],
      "source": {
        "defect": [
          "https://seclists.org/fulldisclosure/2026/Aug/112"
        ],
        "discovery": "EXTERNAL"
      },
      "title": "[NotCVE-2026-0011] Nmap 7.99 and Earlier nselib/packet.lua Zero-Length TCP Option Infinite Loop Allows Remote Denial of Service",
      "x_gcve": [
        {
          "recordType": "advisory",
          "relationships": [],
          "vulnId": "GCVE-1988-2026-0155",
          "x_vulnarchive": {
            "archiveUrl": "https://vuln.freearchive.org/archive/full-disclosure/2026/Aug/112",
            "automated": true,
            "contentSha256": "526e75db3e65ed78ab707f18bcdbc6de452e1ba09cb695995dc1e4c091bc7ef1",
            "evidenceScore": 8,
            "messageId": "",
            "originalUrl": "https://seclists.org/fulldisclosure/2026/Aug/112",
            "policy": "vulnarchive-1",
            "sourceFormat": "text/html",
            "sourcePublishedAt": "2026-08-19T10:57:53Z"
          }
        }
      ]
    }
  },
  "cveMetadata": {
    "assignerOrgId": "4e2abfbf-4a2a-4b76-a4e0-d77c18ba156c",
    "assignerShortName": "VULNARCHIVE",
    "datePublished": "2026-09-07T13:20:22Z",
    "dateUpdated": "2026-09-11T08:13:27Z",
    "state": "PUBLISHED",
    "vulnId": "GCVE-1988-2026-0155"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Loading…