Skip to content

Commit e9a6d66

Browse files
added more checks for parsing
1 parent 49bfa61 commit e9a6d66

File tree

5 files changed

+38
-8
lines changed

5 files changed

+38
-8
lines changed

layers/ipv6.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,15 @@ func (p *IPv6Packet) Parse(data []byte) error {
9090
p.NextHeader = buf[6]
9191
p.NextHeaderDesc = p.nextHeader()
9292
p.HopLimit = buf[7]
93-
p.SrcIP, _ = netip.AddrFromSlice(buf[8:24])
94-
p.DstIP, _ = netip.AddrFromSlice(buf[24:headerSizeIPv6])
93+
var ok bool
94+
p.SrcIP, ok = netip.AddrFromSlice(buf[8:24])
95+
if !ok {
96+
return fmt.Errorf("malformed IPv6 address")
97+
}
98+
p.DstIP, ok = netip.AddrFromSlice(buf[24:headerSizeIPv6])
99+
if !ok {
100+
return fmt.Errorf("malformed IPv6 address")
101+
}
95102
p.Payload = buf[headerSizeIPv6:]
96103
return nil
97104
}

layers/layers.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ func parseNextLayerFromBytes(data []byte) Layer {
8888
return next
8989
}
9090
}
91+
if firstByte == 0x30 {
92+
next = GetNextLayer("SNMP")
93+
if err := next.Parse(buf); err == nil {
94+
return next
95+
}
96+
}
9197
if len(buf) > 3 {
9298
b1 := binary.BigEndian.Uint16(buf[0:2])
9399
b2 := binary.BigEndian.Uint16(buf[2:4])
@@ -138,7 +144,7 @@ func addrMatch(src, dst *uint16, ports []uint16) bool {
138144
return false
139145
}
140146

141-
func parseNextLayerFromAddress(data []byte, src, dst *uint16) Layer {
147+
func parseNextLayerFromPorts(data []byte, src, dst *uint16) Layer {
142148
if len(data) == 0 {
143149
return nil
144150
}
@@ -154,7 +160,7 @@ func parseNextLayerFromAddress(data []byte, src, dst *uint16) Layer {
154160
next = GetNextLayer("FTP")
155161
case addrMatch(src, dst, []uint16{22, 2222, 2200, 222, 2022}):
156162
next = GetNextLayer("SSH")
157-
case addrMatch(src, dst, []uint16{443, 465, 993, 995, 8443, 9443, 10443, 8444}):
163+
case addrMatch(src, dst, []uint16{443, 465, 993, 995, 8443, 9443, 10443, 8444, 5228}):
158164
next = GetNextLayer("TLS")
159165
default:
160166
return nil
@@ -171,7 +177,7 @@ func ParseNextLayer(data []byte, src, dst *uint16) Layer {
171177
buf = append(buf, data...)
172178
var next Layer
173179
if src != nil || dst != nil {
174-
if next = parseNextLayerFromAddress(buf, src, dst); next != nil {
180+
if next = parseNextLayerFromPorts(buf, src, dst); next != nil {
175181
return next
176182
}
177183
}

layers/snmp.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ func (s *SNMPMessage) Summary() string {
1818
}
1919

2020
func (s *SNMPMessage) Parse(data []byte) error {
21+
if data[0] != 0x30 {
22+
return fmt.Errorf("not ASN.1 SEQUENCE")
23+
}
2124
buf := make([]byte, 0, len(data))
2225
buf = append(buf, data...)
2326
s.Payload = buf

layers/ssh.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,28 @@ func (s *SSHMessage) Parse(data []byte) error {
9090
buf := make([]byte, 0, len(data))
9191
buf = append(buf, data...)
9292
if bytes.HasSuffix(buf, crlf) {
93-
s.Protocol = bytesToStr(bytes.TrimSuffix(buf, crlf))
93+
p := bytes.TrimSuffix(buf, crlf)
94+
if !bytes.Contains(p, protoSSH) {
95+
return fmt.Errorf("message should contain SSH-")
96+
}
97+
s.Protocol = bytesToStr(p)
9498
return nil
9599
}
96100
s.Messages = make([]*Message, 0, 3)
97101
for len(buf) > 0 {
102+
if len(buf) < 4 {
103+
return ErrSliceBounds
104+
}
98105
m := &Message{}
99106
s.Messages = append(s.Messages, m)
100107
plen := binary.BigEndian.Uint32(buf[0:4])
101108
if plen > 0xffff {
102109
m.Payload = buf
103110
break
104111
}
112+
if len(buf) < 5 {
113+
return ErrSliceBounds
114+
}
105115
m.MesssageType = buf[5]
106116
if m.MesssageTypeDesc = mtypedesc(m.MesssageType); m.MesssageTypeDesc == "Unknown" {
107117
m.Payload = buf

layers/tcp.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,12 @@ func (t *TCPSegment) Parse(data []byte) error {
127127
t.WindowSize = binary.BigEndian.Uint16(buf[14:16])
128128
t.Checksum = binary.BigEndian.Uint16(buf[16:18])
129129
t.UrgentPointer = binary.BigEndian.Uint16(buf[18:headerSizeTCP])
130-
t.Options = buf[headerSizeTCP : t.DataOffset<<2]
131-
t.Payload = buf[t.DataOffset<<2:]
130+
offset := t.DataOffset << 2
131+
if len(buf) < int(offset) {
132+
return ErrSliceBounds
133+
}
134+
t.Options = buf[headerSizeTCP:offset]
135+
t.Payload = buf[offset:]
132136
return nil
133137
}
134138

0 commit comments

Comments
 (0)