From 66142e24838c22a1b91d19e750dac6c5ba8eaa4b Mon Sep 17 00:00:00 2001 From: itzzdev09 Date: Fri, 11 Sep 2026 19:04:25 +0530 Subject: [PATCH] spnego: don't synthesise a GSSAPI blob from an empty token Dissecting an empty OCTET STRING built a sub-packet from b"". Constructing an ASN1_Packet from empty bytes materialises that class's defaults, so GSSAPI_BLOB(b"") yields the 10-byte SPNEGO OID header: >>> raw(SPNEGO_Token()) b'\x04\x00' >>> raw(SPNEGO_Token(raw(SPNEGO_Token()))) b'\x04\n\x60\x08\x06\x06\x2b\x06\x01\x05\x05\x02' AI-Assisted: yes (Claude Code, Claude Opus 5) Co-Authored-By: Claude Opus 5 --- scapy/asn1fields.py | 2 ++ scapy/layers/spnego.py | 2 ++ test/scapy/layers/spnego.uts | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py index 0d92161153e..a88ae515b70 100644 --- a/scapy/asn1fields.py +++ b/scapy/asn1fields.py @@ -1085,4 +1085,6 @@ def __init__(self, def m2i(self, pkt, s): # type: ignore # type: (ASN1_Packet, bytes) -> Tuple[ASN1_Packet, bytes] val = super(ASN1F_STRING_ENCAPS, self).m2i(pkt, s) + if not val[0].val: + return val[0], val[1] # type: ignore return self.cls(val[0].val, _underlayer=pkt), val[1] diff --git a/scapy/layers/spnego.py b/scapy/layers/spnego.py index 53122beaeef..1102c152c37 100644 --- a/scapy/layers/spnego.py +++ b/scapy/layers/spnego.py @@ -143,6 +143,8 @@ def i2m(self, pkt, x): def m2i(self, pkt, s): dat, r = super(_SPNEGO_Token_Field, self).m2i(pkt, s) + if not dat.val: + return dat, r types = None if isinstance(pkt.underlayer, SPNEGO_negTokenInit): types = pkt.underlayer.mechTypes diff --git a/test/scapy/layers/spnego.uts b/test/scapy/layers/spnego.uts index e1550590400..3901575409d 100644 --- a/test/scapy/layers/spnego.uts +++ b/test/scapy/layers/spnego.uts @@ -437,3 +437,16 @@ try: assert False, "Should have failed !" except ValueError: pass + ++ SPNEGO packets + += SPNEGO_Token - build and dissect empty payloads + +pkt = SPNEGO_Token() +assert raw(pkt) == b"\x04\x00" +assert raw(SPNEGO_Token(raw(pkt))) == raw(pkt) +assert not SPNEGO_Token(raw(pkt)).value + +pkt = SPNEGO_MechListMIC() +assert raw(pkt) == b"\x04\x00" +assert raw(SPNEGO_MechListMIC(raw(pkt))) == raw(pkt)