Skip to content

Commit 85825ed

Browse files
guedougpotter2
authored andcommitted
Detect TCPError/UDPerror/SCTPerror after IPv6 Extension Headers
1 parent ed0707e commit 85825ed

3 files changed

Lines changed: 24 additions & 3 deletions

File tree

scapy/layers/inet6.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,11 +693,23 @@ def in6_chksum(nh, u, p):
693693
#############################################################################
694694
#############################################################################
695695

696+
nh_clserror = {socket.IPPROTO_TCP: TCPerror,
697+
socket.IPPROTO_UDP: UDPerror}
698+
696699

697700
# Inherited by all extension header classes
698701
class _IPv6ExtHdr(_IPv6GuessPayload, Packet):
699702
name = 'Abstract IPv6 Option Header'
700-
aliastypes = [IPv6, IPerror6] # TODO ...
703+
aliastypes = [IPv6]
704+
705+
def guess_payload_class(self, payload):
706+
if self.nh in nh_clserror:
707+
underlayer = self.underlayer
708+
while underlayer:
709+
if isinstance(underlayer, IPerror6):
710+
return nh_clserror[self.nh]
711+
underlayer = underlayer.underlayer
712+
return super(_IPv6ExtHdr, self).guess_payload_class(payload)
701713

702714

703715
# IPv6 options for Extension Headers #

scapy/layers/sctp.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
)
3838
from scapy.data import SCTP_SERVICES
3939
from scapy.layers.inet import IP, IPerror
40-
from scapy.layers.inet6 import IP6Field, IPv6, IPerror6
40+
from scapy.layers.inet6 import IP6Field, IPv6, IPerror6, nh_clserror
4141

4242
IPPROTO_SCTP = 132
4343

@@ -304,6 +304,8 @@ def mysummary(self):
304304
return Packet.mysummary(self)
305305

306306

307+
nh_clserror[IPPROTO_SCTP] = SCTPerror
308+
307309
# SCTP Chunk variable params
308310

309311

test/scapy/layers/inet6.uts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1996,7 +1996,7 @@ def test_getmacbyip6(mock_route6, mock_neighsol):
19961996

19971997
test_getmacbyip6() == "05:04:03:02:01:00"
19981998

1999-
= IPv6 - IPerror6 & UDPerror & _ICMPv6Error
1999+
= IPv6 - IPerror6 & UDPerror & _ICMPv6Error & TCPerror
20002000

20012001
query = IPv6(dst="2001:db8::1", src="2001:db8::2", hlim=1)/UDP()/DNS()
20022002
answer = IPv6(dst="2001:db8::2", src="2001:db8::1", hlim=1)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::2", hlim=0)/UDPerror()/DNS()
@@ -2007,6 +2007,13 @@ from scapy.layers.inet6 import _ICMPv6Error
20072007
assert _ICMPv6Error().guess_payload_class(None) == IPerror6
20082008
assert _ICMPv6Error().hashret() == b''
20092009

2010+
# Test with extension header
2011+
# From:
2012+
# pkt = IPv6() / ICMPv6DestUnreach() / IPerror6 () / IPv6ExtHdrFragment(nh=6) / TCPerror()
2013+
raw_pkt = b'`\x00\x00\x00\x00L:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00l5\x00\x00\x00\x00`\x00\x00\x00\x00\x1c,@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00'
2014+
IPv6(raw_pkt).summary()
2015+
assert TCPerror in IPv6(raw_pkt)
2016+
20102017
= reset routes properly
20112018

20122019
conf.ifaces.reload()

0 commit comments

Comments
 (0)